Press "Enter" to skip to content

【SwiftUI】@EnvironmentObject

データクラスを複数のViewで同期して共有することができます。

公式ドキュメント: https://developer.apple.com/documentation/swiftui/environmentobject

@ObserverdObject も同様の機能がありますが、違いは親Viewの@ObserverdObject のデータは、子階層のViewと共有するのに親から子までのすべてのView間でデータを受け渡ししていくのに対し、@EnvironmentObject は任意の階層の子Viewから一気に親データを受け取ることができます。

実装

  1. データを共有する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 も同期されて書き換わります。

コメントを残す

メールアドレスが公開されることはありません。