如何设置多个相同类型的 EnvironmentObjects

Wof*_*kee 9 publish observable swiftui combine

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

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

喜欢

let rootView = ContentView()
     .environmentObject(firstBindable)
     .environmentObject(secondBindable)
Run Code Online (Sandbox Code Playgroud)

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

所以我测试了这个

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

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

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

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

TestView().environmentObject(TempStr(initStr: "1st")) 
Run Code Online (Sandbox Code Playgroud)

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


实际上,我知道它行不通,但我只是尝试使用此问题。

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

谢谢

小智 5

这有效:

场景委托:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

内容查看:

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

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

但是,如果您想要模型/类/其他内容的两个实例,那么感觉就像是重构的候选者。

  • 我知道一个类可以有多个相同类型的对象。我只是想知道当我面对这种情况时我能有什么解决方案。当然我可以进行重构并创建一个具有多个相同类型对象和其他对象的类。但询问是否还有其他我不知道的方法也不错。:) 谢谢 (2认同)