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

问题描述 投票:3回答:1

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

这是错误吗?如果没有,那么将视图绑定到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来解决此问题,但如果可能的话,我想避免这样做。

ios swift swiftui combine
1个回答
3
投票

嵌套模型在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()
        }
    } 
}

基本上是您的AppModelSubmodel捕获事件并将其进一步发送到视图

编辑:

如果您不需要SubModel上课,则可以尝试这样的事情:

struct Submodel{
    var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: Submodel = Submodel()
}
© www.soinside.com 2019 - 2024. All rights reserved.