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



我发现了这个问题swiftui:将多个可绑定的对象放入envionment

答案上述环境对象(可观察对象(返回修改的视图,因此我可以为多个环境对象进行呼叫链。

喜欢

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

我想知道,如果可以使用第一个和第二种类型的类型,则会产生什么。.environmentObject()如何知道旨在在firstBindablesecondBindable之间设置的程序员的Exect值。

所以我测试了这个

  1. 我做了一个可观察的对象类
final class TempStr: ObservableObject {
    @Published var tmpStr = "temp"
    
    init(initStr: String) {
        tmpStr = initStr
    }
}
  1. 从SceneDelegate
  2. 制作了环境观察的呼叫链
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. 结果是'第一第一'

,如果我的代码调用一个.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的两个实例而不希望每个模型中的每个实例?您可以轻松地将两个单独的类作为模型的PAT(以及ObservableObjects(,如果您需要每个SceneDelegate的模型两个单独的实例?在那里。

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

相关内容

  • 没有找到相关文章

最新更新