一尘不染

如何告诉SwiftUI视图绑定到嵌套的ObservableObjects

swift

我有一个SwiftUI视图,其中包含一个名为的EnvironmentObject
appModel。然后,它读取appModel.submodel.countbody方法中的值。我希望这可以将我的视图绑定到该属性countsubmodel以便在属性更新时重新呈现该属性,但这似乎没有发生。

这是一个错误吗?如果没有,将视图绑定到SwiftUI中环境对象的嵌套属性的惯用方式是什么?

具体来说,我的模型看起来像这样…

class Submodel: ObservableObject {
  @Published var count = 0
}

class AppModel: ObservableObject {
  @Published var submodel: Submodel = Submodel()
}

我的观点看起来像这样…

struct ContentView: View {
  @EnvironmentObject var appModel: AppModel

  var body: some View {
    Text("Count: \(appModel.submodel.count)")
      .onTapGesture {
        self.appModel.submodel.count += 1
      }
  }
}

当我运行应用程序并单击标签时,count属性会增加,但标签不会更新。

我可以通过将appModel.submodel属性作为传入来解决此问题ContentView,但如果可能的话,我想避免这样做。


阅读 423

收藏
2020-07-07

共1个答案

一尘不染

嵌套模型在SwiftUI中尚不可用,但是您可以执行以下操作

class Submodel: ObservableObject {
    @Published var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: Submodel = Submodel()

    var anyCancellable: AnyCancellable? = nil

    init() {
        anyCancellable = submodel.objectWillChange.sink { (_) in
            self.objectWillChange.send()
        }
    } 
}

基本上,您可以AppModel捕获事件Submodel并将其发送到视图

编辑:

如果您不需要SubModel上课,则可以尝试以下方法:

struct Submodel{
    var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: Submodel = Submodel()
}
2020-07-07