SwiftUIでPreviewを使っていたところ、
このようなエラーに遭遇しました。
Thread 1: Fatal error: No observable object of type DataManager found.
A View.environmentObject(_:)
現時点の最新のXcode11.6では、ビルドできるのにプレビューに失敗している時、以下の画像のように表示されます。Diagnosticsを押しても、よくわからないエラーが書かれています。
クラッシュログの場所を探す
正確なクラッシュログは
~/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を書かないといけない
}
}