11

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

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

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

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

所以我测试了这个

  1. 我做了一个 ObservableObject 类
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. 并使用 View 中的值
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()call 设置了相同类型的所有值。


实际上,我知道它不起作用,但我只是尝试使用这个问题。

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

谢谢

4

1 回答 1

3

这有效:

场景委托:

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

诚然,这可能不是您要寻找的,但这引出了一个问题 - 为什么想要 a 的两个实例class而不想要模型中的每个实例?您可以轻松地将两个单独的类作为模型的 pat (和 as ObservableObjects),如果您想要模型的两个单独的实例 per SceneDelegate? 它在那里。

但是如果你想要你的模型/类/其他的两个实例,它感觉就像一个重构的候选者。

于 2019-08-05T21:59:08.820 回答