SwiftUI:ObservableObject不会更新其他视图

时间:2020-08-27 13:17:38

标签: swiftui observable

我有两种看法:

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重绘。

我哪里出错了?

1 个答案:

答案 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)")
     ...
     }
}