我发现了这个问题swiftui:将多个可绑定的对象放入envionment
答案上述环境对象(可观察对象(返回修改的视图,因此我可以为多个环境对象进行呼叫链。
喜欢
let rootView = ContentView()
.environmentObject(firstBindable)
.environmentObject(secondBindable)
我想知道,如果可以使用第一个和第二种类型的类型,则会产生什么。.environmentObject()
如何知道旨在在firstBindable
和secondBindable
之间设置的程序员的Exect值。
所以我测试了这个
- 我做了一个可观察的对象类
final class TempStr: ObservableObject {
@Published var tmpStr = "temp"
init(initStr: String) {
tmpStr = initStr
}
}
- 从SceneDelegate 制作了环境观察的呼叫链
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
的两个实例而不希望每个模型中的每个实例?您可以轻松地将两个单独的类作为模型的PAT(以及ObservableObjects
(,如果您需要每个SceneDelegate
的模型两个单独的实例?在那里。
但是,如果您想要模型/类/其他的两个实例,感觉就像是重构的候选人。