LoginSignup
0

More than 1 year has passed since last update.

[SwiftUI]EnvironmentObjectをあるViewに入れるとPreviewができない

SwiftUIでPreviewを使っていたところ、
このようなエラーに遭遇しました。

Thread 1: Fatal error: No observable object of type DataManager found.
A View.environmentObject(_:)

現時点の最新のXcode11.6では、ビルドできるのにプレビューに失敗している時、以下の画像のように表示されます。Diagnosticsを押しても、よくわからないエラーが書かれています。

スクリーンショット 2020-09-06 18.40.25.png

クラッシュログの場所を探す

正確なクラッシュログは

~/Library/Logs/DiagnosticReports

にあります。このディレクトリの中から該当するアプリのクラッシュログを探します。
中身を見てみると、一番初めのエラーを見つけました。

問題のあるコード

Viewの構成は以下のようになっています。
ContentView -> SubView -> ChildView

ContentView.swift
var body: some View {
   SubView()
}
...
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(DataManager())
    }
}

SubView.swift
var body: some View {
   ChildView()
}
...
struct SubView_Previews: PreviewProvider {
    static var previews: some View {
        SubViewView()
    }
}
ChildView.swift

@ObservableObject var dataManager: DataManager

var body: some View {
   Text(self.manager.message)
}
...
struct ChildView_Previews: PreviewProvider {
    static var previews: some View {
        ChildViewView()
            .environmentObject(DataManager())
    }
}

原因と解決策

ContentViewにDataManagerをenvironmentObjectとして追加しているので、アプリ起動の際は問題ありませんでした。
しかし、プレビューができませんでした。
数時間をかけて解決策を探したところ、以下のような原因と解決方法を見つけました。

原因

  • ContentView_Previews:envirnmentObjectを追加している
  • SubView_Previews:environmentObjectを追加していない
  • ChildView_Previews:environmentObjectを追加している

SubView_PreviewsにenvironmentObjectを追加していなことが原因でした。

解決策

SubView.swift
struct SubView_Previews: PreviewProvider {
    static var previews: some View {
        SubViewView()
            .environmentObject(DataManager()) //←このViewでは使ってないけどここにもenvironmentObjectを書かないといけない
    }
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0