親viewからObservedObjectを子viewへ1つ渡す。
子viewで多種類あるObservedObjectから、渡されたObservedObjectだけを使いたい。
@ObservedObjectのproperty wrapper に準拠しないといけないので、以下のようなことができなくて困った。
・子viewでObservableObjectをnilにして使う。
Generic struct 'ObservedObject' requires that 'Test1Manager?' conform to 'ObservableObject'
でエラーが出る。
struct ParentView: View {
@ObservedObject var test1Manager: Test1Manager
@ObservedObject var test2Manager: Test2Manager
@ObservedObject var test3Manager: Test3Manager
var body: some View {
ChildView(test1Manager: test1Manager)
}
}
struct ChildView: View {
@ObservedObject var test1Manager: Test1Manager?
@ObservedObject var test2Manager: Test2Manager?
@ObservedObject var test3Manager: Test3Manager?
var body: some View {
Text("\(test2Manager.text)")
}
}
解決
子viewでは、複数あるObservedObjectのうちどれを使うか条件分岐し、孫でObservedObjectを使う。
親から子viewへ使いたいObservedObjectを1つ渡し、子では変数に格納して、その変数がnilかどうかで条件分岐し、孫にObservedObjectを渡す。
struct ParentView: View {
@ObservedObject var test1Manager: Test1Manager
@ObservedObject var test2Manager: Test2Manager
@ObservedObject var test3Manager: Test3Manager
var body: some View {
ChildView(test1Manager: test1Manager)
}
}
struct ChildView: View {
var test1Manager: Test1Manager?
var test2Manager: Test2Manager?
var test3Manager: Test3Manager?
var body: some View {
if let test1Manager = test1Manager {
Content(test1Manager: test1Manager)
} else if let test2Manager = test2Manager {
Content2(test2Manager: test2Manager)
} else if let test3Manager = test3Manager {
Content3(test3Manager: test3Manager)
} else {
Text("データはありません。")
}
}
private struct Content1: View {
@ObservedObject var test1Manager: Test1Manager?
var body: some View {
Text(test1Manager.text)
}
}
private struct Content2: View {
@ObservedObject var test2Manager: Test2Manager?
var body: some View {
Text(test2Manager.text)
}
}
private struct Content3: View {
@ObservedObject var test3Manager: Test3Manager?
var body: some View {
Text(test3Manager.text)
}
}
}