17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[SwiftUI]EnvironmentObjectの罠

Posted at

EnvironmentObjectを使っていたところ、以下のようなエラーに遭遇しました。

Fatal error: No ObservableObject of type **** found.
A View.environmentObject(_:) for * may be missing as an ancestor of this view.

これは、直前に


}
.sheet(isPresented: $isPresented) {
     ModalView(showingModal: self.$isPresented)
}

という操作を行っていました。ModalViewの中では呼び出し元と同じEnvironmentObjectを宣言していました。

原因

こちらを参考にしました。

https://stackoverflow.com/questions/58743004/swiftui-environmentobject-error-may-be-missing-as-an-ancestor-of-this-view
https://github.com/peterfriese/Swift-EnvironmentObject-Demo

この記事によると、sheetによるモーダル表示は、rootとなるContentViewとは全く別のツリー構造となっているようでした。

  • ContentView
    • SubView
    • SubView
      • ChildView
  • ModalView

というような感じです。

解決策

ここのModalViewでも同じEnvironmentObjectを使うためには、以下のようにして渡します。


}
.sheet(isPresented: $isPresented) {
     ModalView(showingModal: self.$isPresented)
        .environmentObject(someObject)
}
17
8
0

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
  3. You can use dark theme
What you can do with signing up
17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?