非常に便利な@EnvironmentObjectですが、1つの型に対して1つのインスタンスしか持てません。
使用しているとなんとなく分かると思いますが、environmentObject()を呼び出す際にはインスタンスを渡すのみであり、キーの設定などは行いません。
また@EnvironmentObjectといて使用する際には、自由に変数名をつけることができます。
このことから、SwiftUIはオブジェクトのクラスを判別し、Environment領域への登録と呼び出しを行っていると考えられます。
実際に試してみましょう。
class ObsObj: ObservableObject {
@Published var text:String
init(text:String) {
self.text = text
}
}
let contentView = ContentView()
.environmentObject(ObsObj(text: "Test1"))
.environmentObject(ObsObj(text: "Test2"))
struct ContentView: View {
@EnvironmentObject var testObj1:ObsObj
@EnvironmentObject var testObj2:ObsObj
var body: some View {
VStack{
Text(testObj1.text)
Text(testObj2.text)
}
}
}
単純に文字列を保持するクラスを用意し、インスタンスを2個生成しましたが、View側では先に渡したTest1のみが表示されました。
同一のクラスを複数インスタンス扱いたい場合は、上位のクラスを作って中に納める他ないようです。
そもそもモデル設計ちゃんとすれば良いのでは?は無しでお願いします。
コメント
[…] […]