如何设置多个相同类型的环境对象

How to set multiple EnvironmentObjects which are same type

我找到了这个问题

答案说 environmentObject(ObservableObject) returns 修改了视图,因此我可以为多个 environmentObject 创建调用链。

喜欢

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

我想知道如果 firstBindable 和 secondBindable 是同一类型会产生什么结果。 .environmentObject() 如何知道什么是程序员打算在 firstBindablesecondBindable 之间设置的期望值。

所以我测试了这个

  1. 我制作了一个 ObservableObject class
final class TempStr: ObservableObject {
    @Published var tmpStr = "temp"

    init(initStr: String) {
        tmpStr = initStr
    }
}
  1. 从 sceneDelegate 建立了 environmentObject 的调用链
window.rootViewController
  = UIHostingController(rootView:
      TestView()
        .environmentObject(TempStr(initStr: "1st")) 
        .environmentObject(TempStr(initStr: "2nd"))
  1. 并使用视图中的值
struct TestView: View {
  @EnvironmentObject var tmp1: TempStr
  @EnvironmentObject var tmp2: TempStr

   var body: some View {
      Text(tmp1.tmpStr + " " + tmp2.tmpStr)
   }
}
  1. 结果是“1st 1st”

如果我的代码调用一个 .environmentObject() 就像

TestView().environmentObject(TempStr(initStr: "1st")) 

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


其实我知道不行,只是为了用这个问题试了一下

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

谢谢

这个有效:

场景代理:

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
    }
}

内容视图:

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

当然,这可能 不是 您要找的东西,但这引出了一个问题 - 为什么想要 class 的两个实例而不想要每个实例你的模型?你可以很容易地有两个 separate 类 作为你的模型的一部分(和 ObservableObjects),如果你想要每个 [=14= 的模型的两个单独的实例]?就是它了。

但是如果你想要你的 model/class/whatever 的两个实例,感觉就像重构的候选者。