【问题标题】:SwiftUI: ObservableObject not updating other viewSwiftUI:ObservableObject 不更新其他视图
【发布时间】:2020-08-27 13:17:38
【问题描述】:

我有两种看法:

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。

我哪里出错了?

【问题讨论】:

    标签: swiftui observable


    【解决方案1】:

    您可以使用environmentObject method 将@ObservedObject 提供给其他视图:

    struct ViewA: View {
        @ObservedObject var nameSpace = NameSpace()
        var body: some View {
         ...
         ViewB().environmentObject(nameSpace)
         ...
         }
    }
    

    然后在视图B中

    struct ViewB: View {
        @EnvironmentObject var nameSpace: NameSpace
        var body: some View {
         ...
         Text("Namespace: \(nameSpace.name)")
         ...
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2016-09-25
      相关资源
      最近更新 更多