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

时间:2019-10-17 17:27:11

标签: ios swift swiftui combine

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

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

How to tell SwiftUI views to bind to nested ObservableObjects

这是模型:

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
        }
    }
  }
}

将其添加到模型类(请参见前面的Stackoverflow问题)可用于更新submodel1的更改,但不能同时更新:

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

我正在寻找的是一种将子模型1和子模型2的更改传递给我的视图的方法。

1 个答案:

答案 0 :(得分:3)

您可以通过使用CombineLatest来使模型在其基础对象中的任何一个发生更改时触发其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()
        })
    }
}