我发现了这个问题SwiftUI: Putting multiple BindableObjects into Envionment

答案说,environmentObject(ObservableObject)返回修改后的 View ,因此我可以为多个environmentObject建立调用链。

喜欢

let rootView = ContentView()
     .environmentObject(firstBindable)
     .environmentObject(secondBindable)

我不知道firstBindable和secondBindable是同一类型会导致什么结果。 .environmentObject()如何知道什么是exect值,这是程序员打算在firstBindablesecondBindable之间设置的值。

所以我测试了
  • 我做了一个ObservableObject类

  • final class TempStr: ObservableObject {
        @Published var tmpStr = "temp"
    
        init(initStr: String) {
            tmpStr = initStr
        }
    }
    
  • 从sceneDelegate
  • 取得environmentObject的调用链
    window.rootViewController
      = UIHostingController(rootView:
          TestView()
            .environmentObject(TempStr(initStr: "1st"))
            .environmentObject(TempStr(initStr: "2nd"))
    
  • 和View
  • 中使用的值
    struct TestView: View {
      @EnvironmentObject var tmp1: TempStr
      @EnvironmentObject var tmp2: TempStr
    
       var body: some View {
          Text(tmp1.tmpStr + " " + tmp2.tmpStr)
       }
    }
    
  • 结果为“1st 1st”

  • 如果我的代码像这样调用一个.environmentObject()
    TestView().environmentObject(TempStr(initStr: "1st"))
    

    TestView中的tmp1和tmp2都具有相同的值TempStr(initStr: "1st")。看起来.environmentObject()调用设置了所有相同类型的值。

    其实,我知道这行不通,但我只是尝试使用此问题进行尝试。

    我想知道实现我的目标的正确方法是什么。

    谢谢

    最佳答案

    这有效:

    SceneDelegate:

    class MyModel: ObservableObject {
        @Published var tmpStr1:TempStr!
        @Published var tmpStr2:TempStr!
    
        init(initStr1: String, initStr2:String) {
            tmpStr1 = TempStr(initStr: initStr1)
            tmpStr2 = TempStr(initStr: initStr2)
        }
    }
    class TempStr: ObservableObject {
        @Published var tmpStr:String!
    
        init(initStr: String) {
            tmpStr = initStr
        }
    }
    

    ContentView:
    struct ContentView: View {
        @EnvironmentObject var myModel: MyModel
        var body: some View {
            Text(myModel.tmpStr1.tmpStr + " " + myModel.tmpStr2.tmpStr)
        }
    }
    

    当然,这可能不是您要查找的内容,但这引出了一个问题-为什么要在模型中想要两个class实例而不想要每个实例?您可以轻松地将两个单独的类作为模型的模型(以及作为ObservableObjects),并且是否要每个SceneDelegate两个模型的单独实例?在那里。

    但是,如果您想要模型/类/任何东西的两个实例,则感觉像是重构的候选对象。

    关于observable - 如何设置相同类型的多个环境对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57360838/

    10-12 03:44