我发现了这个问题SwiftUI: Putting multiple BindableObjects into Envionment
答案说,environmentObject(ObservableObject)返回修改后的 View ,因此我可以为多个environmentObject建立调用链。
喜欢
let rootView = ContentView()
.environmentObject(firstBindable)
.environmentObject(secondBindable)
我不知道firstBindable和secondBindable是同一类型会导致什么结果。
.environmentObject()
如何知道什么是exect值,这是程序员打算在firstBindable
和secondBindable
之间设置的值。所以我测试了
final class TempStr: ObservableObject {
@Published var tmpStr = "temp"
init(initStr: String) {
tmpStr = initStr
}
}
window.rootViewController
= UIHostingController(rootView:
TestView()
.environmentObject(TempStr(initStr: "1st"))
.environmentObject(TempStr(initStr: "2nd"))
struct TestView: View {
@EnvironmentObject var tmp1: TempStr
@EnvironmentObject var tmp2: TempStr
var body: some View {
Text(tmp1.tmpStr + " " + tmp2.tmpStr)
}
}
如果我的代码像这样调用一个.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/