如何设置多个相同类型的环境对象
How to set multiple EnvironmentObjects which are same type
我找到了这个问题
答案说 environmentObject(ObservableObject) returns 修改了视图,因此我可以为多个 environmentObject 创建调用链。
喜欢
let rootView = ContentView()
.environmentObject(firstBindable)
.environmentObject(secondBindable)
我想知道如果 firstBindable 和 secondBindable 是同一类型会产生什么结果。 .environmentObject()
如何知道什么是程序员打算在 firstBindable
和 secondBindable
之间设置的期望值。
所以我测试了这个
- 我制作了一个 ObservableObject class
final class TempStr: ObservableObject {
@Published var tmpStr = "temp"
init(initStr: String) {
tmpStr = initStr
}
}
- 从 sceneDelegate 建立了 environmentObject 的调用链
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)
}
}
- 结果是“1st 1st”
如果我的代码调用一个 .environmentObject() 就像
TestView().environmentObject(TempStr(initStr: "1st"))
TestView 中的 tmp1 和 tmp2 具有相同的值 TempStr(initStr: "1st")
。看起来 .environmentObject()
调用设置了所有相同类型的值。
其实我知道不行,只是为了用这个问题试了一下
我想知道实现目标的正确方法是什么。
谢谢
这个有效:
场景代理:
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)
}
}
当然,这可能 不是 您要找的东西,但这引出了一个问题 - 为什么想要 class
的两个实例而不想要每个实例你的模型?你可以很容易地有两个 separate 类 作为你的模型的一部分(和 ObservableObjects
),如果你想要每个 [=14= 的模型的两个单独的实例]?就是它了。
但是如果你想要你的 model/class/whatever 的两个实例,感觉就像重构的候选者。
我找到了这个问题
答案说 environmentObject(ObservableObject) returns 修改了视图,因此我可以为多个 environmentObject 创建调用链。
喜欢
let rootView = ContentView()
.environmentObject(firstBindable)
.environmentObject(secondBindable)
我想知道如果 firstBindable 和 secondBindable 是同一类型会产生什么结果。 .environmentObject()
如何知道什么是程序员打算在 firstBindable
和 secondBindable
之间设置的期望值。
所以我测试了这个
- 我制作了一个 ObservableObject class
final class TempStr: ObservableObject {
@Published var tmpStr = "temp"
init(initStr: String) {
tmpStr = initStr
}
}
- 从 sceneDelegate 建立了 environmentObject 的调用链
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)
}
}
- 结果是“1st 1st”
如果我的代码调用一个 .environmentObject() 就像
TestView().environmentObject(TempStr(initStr: "1st"))
TestView 中的 tmp1 和 tmp2 具有相同的值 TempStr(initStr: "1st")
。看起来 .environmentObject()
调用设置了所有相同类型的值。
其实我知道不行,只是为了用这个问题试了一下
我想知道实现目标的正确方法是什么。
谢谢
这个有效:
场景代理:
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)
}
}
当然,这可能 不是 您要找的东西,但这引出了一个问题 - 为什么想要 class
的两个实例而不想要每个实例你的模型?你可以很容易地有两个 separate 类 作为你的模型的一部分(和 ObservableObjects
),如果你想要每个 [=14= 的模型的两个单独的实例]?就是它了。
但是如果你想要你的 model/class/whatever 的两个实例,感觉就像重构的候选者。