8
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] 親から1つObservedObjectを渡して、子viewでそれを使いたいが、Generic struct 'ObservedObject' requires that 'Test1Manager?' conform to 'ObservableObject'が出る

Last updated at Posted at 2021-10-27

親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)
        }
    }
}
8
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
8
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?