データクラスを複数のViewで同期して共有することができます。
公式ドキュメント: https://developer.apple.com/documentation/swiftui/environmentobject
@ObserverdObject
も同様の機能がありますが、違いは親Viewの@ObserverdObject
のデータは、子階層のViewと共有するのに親から子までのすべてのView間でデータを受け渡ししていくのに対し、@EnvironmentObject
は任意の階層の子Viewから一気に親データを受け取ることができます。
実装
- データを共有する
ObservableObject
のモデルを用意します。
class User: ObservableObject {
@Published var name = "山田太郎"
}
2. 親Viewを表示する時に environmentObject
モディファイアで共有するデータを渡します。
ContentView()
.environmentObject(User())
3. environmentObject
モディファイアで渡されたデータと同じデータ型を@EnvironmentObject
をつけて親Viewに定義します。
struct ContentView: View {
@EnvironmentObject var user: User
}
4. データを受け取る子Viewも同様に@EnvironmentObject
をつけてデータを定義し、$user
をつけると参照することができます。
struct ContentView: View {
@EnvironmentObject var user: User
var body: some View {
ViewA()
}
}
struct ViewA: View {
var body: some View {
ViewB()
}
}
struct ViewB: View {
@EnvironmentObject var user: User
var body: some View {
TextField("名前: ", text: $user.name)
}
}
以上です。ViewB の TextFieldで user.name を書き換えれば、親Viewの user.name も同期されて書き換わります。