繁体   English   中英

如何告诉 SwiftUI 视图绑定到多个嵌套的 ObservableObject

[英]How to tell SwiftUI views to bind to more than one nested ObservableObject

我有两个类嵌套在另一个 class 中,这是 SwiftUI 视图中的可观察 object。 即使嵌套类中的属性被声明为@Published,它们的值(当它们改变时)也不会在主视图中更新。

这里提出了一个类似的问题,我可以使用它来使其适用于两个子类之一,但不能同时适用于两者。

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

这是 model:

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

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

class Model: ObservableObject {
  @Published var submodel1: Submodel1 = Submodel1()
  @Published var submodel2: Submodel2 = Submodel2()
}

这是主要观点:

struct ContentView: View {
  @ObservedObject var model: Model = Model()

  var body: some View {
    VStack {
      Text("Count: \(model.submodel1.count)")
        .onTapGesture {
          self.model.submodel1.count += 1
        }
      Text("Count: \(model.submodel2.count)")
        .onTapGesture {
          self.model.submodel2.count += 1
        }
    }
  }
}

将此添加到 model class (请参阅之前的 Stackoverflow 问题)适用于更新 submodel1 更改,但不能同时更新:

  var anyCancellable: AnyCancellable? = nil
  init() {
      anyCancellable = submodel1.objectWillChange.sink { (_) in
          self.objectWillChange.send()
      }
   }

我正在寻找的是将 submodel1 和 submodel2 的更改传递给我的视图的某种方式。

您可以通过使用CombineLatest来扩展您链接到的问题的答案,让您的 model 在任一基础对象发生更改时触发其objectWillChange发布者:

import Combine

class Model: ObservableObject {
    @Published var submodel1: Submodel1 = Submodel1()
    @Published var submodel2: Submodel2 = Submodel2()

    var anyCancellable: AnyCancellable? = nil

    init() {
        anyCancellable = Publishers.CombineLatest(submodel1.$count,submodel2.$count).sink(receiveValue: {_ in
            self.objectWillChange.send()
        })
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM