我有两种看法:
struct Login: View {
@ObservedObject var Namespace = namespace()
Button(action: {
Namespace.changeNamespace(spacename: "Whatever")
}) {
Text("Change name")
}
...
}
和
struct Main: View {
@ObservedObject var Namespace = namespace()
Button(action: {
Namespace.changeNamespace(spacename: "Whatever")
}) {
Text("Change name")
}
Text("Namespace: \(Namespace.name)")
...
}
我也有对象本身:
class namespace: ObservableObject {
@Published private(set) var name = String()
...
func changeNamespace(spacename:String){
self.name = spacename
}
}
我观察到以下情况:
当我点击主视图上的按钮时,主视图上的文本会更改(预期行为)
但是,如果我单击登录视图上的按钮,则主视图上的文本不会更改。
从某种意义上讲,由于任一视图中的命名空间对象都是“命名空间”对象的单独实例,但是我认为可观察对象的全部目的是,所有此类视图都会反映出这种对象的变化正在观察这个物体。
简而言之:
我想在视图A中更改一个对象,以便视图B重绘。
我哪里出错了?
答案 0 :(得分:0)
您可以使用@ObservedObject
method向其他视图提供environmentObject
:
struct ViewA: View {
@ObservedObject var nameSpace = NameSpace()
var body: some View {
...
ViewB().environmentObject(nameSpace)
...
}
}
然后在ViewB中
struct ViewB: View {
@EnvironmentObject var nameSpace: NameSpace
var body: some View {
...
Text("Namespace: \(nameSpace.name)")
...
}
}