SwiftUI:ObservableObject 不更新其他视图
SwiftUI: ObservableObject not updating other view
我有两种看法:
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
}
}
我观察到以下情况:
当我点击主视图上的按钮时,主视图上的文本发生变化(预期行为)
但是,如果我点击登录视图上的按钮,主视图上的文本不会改变。
在某种程度上是有道理的,因为任一视图中的命名空间对象都是 'namespace' 对象的单独实例,但我认为可观察对象的全部目的是反映此类对象的更改通过所有正在观察此对象的视图。
简而言之:
我想改变视图A中的一个对象,以便重绘视图B。
我哪里出错了?
您可以使用 environmentObject
method:
向其他视图提供 @ObservedObject
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)")
...
}
}
我有两种看法:
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
}
}
我观察到以下情况:
当我点击主视图上的按钮时,主视图上的文本发生变化(预期行为)
但是,如果我点击登录视图上的按钮,主视图上的文本不会改变。
在某种程度上是有道理的,因为任一视图中的命名空间对象都是 'namespace' 对象的单独实例,但我认为可观察对象的全部目的是反映此类对象的更改通过所有正在观察此对象的视图。
简而言之:
我想改变视图A中的一个对象,以便重绘视图B。
我哪里出错了?
您可以使用 environmentObject
method:
@ObservedObject
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)")
...
}
}