ios - 如何告诉 SwiftUI View 绑定(bind)到嵌套的 Observable 对象

标签 ios swift swiftui combine

我有一个 SwiftUI View ,它接受一个名为 appModel 的环境对象。然后,它在其 body 方法中读取值 appModel.submodel.count。我希望这会将我的 View 绑定(bind)到 submodel 上的属性 count ,以便在属性更新时重新渲染,但这似乎不会发生。

这是一个错误吗?如果没有,在 SwiftUI 中将 View 绑定(bind)到环境对象的嵌套属性的惯用方法是什么?

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

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 来解决此问题,但如果可能的话,我希望避免这样做。

最佳答案

嵌套模型在 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 { [weak self] (_) in
            self?.objectWillChange.send()
        }
    } 
}

基本上,您的AppModelSubModel捕获事件并将其进一步发送到View

编辑:

如果您不需要 SubModel 成为类,那么您可以尝试这样的操作:

struct SubModel{
    var count = 0
}

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

关于ios - 如何告诉 SwiftUI View 绑定(bind)到嵌套的 Observable 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58406287/

相关文章:

objective-c - 桥接 Swift 4 枚举到 Objective C

struct - Swift 和变异结构

swift - 生成的 MTLTexture 比 CGImage 更轻

swift - 当 AsyncImage SwiftUI 中的图像 URL 发生变化时,如何监听新阶段的成功

image - SwiftUI - 在列表/表单中显示图像,单元格周围没有边框

ios - 自定义 xib 在 super View 中大小不正确

ios - 基于NSDate将数组映射到字典

ios - 跨多个应用共享 Facebook App ID

swift - 无法推断通用参数 'FalseContent'

ios - Firebase 云消息传递 - iOS 角标(Badge)