Как заставить представления SwiftUI связываться с несколькими вложенными объектами ObservableObject? - PullRequest
2 голосов
/ 17 октября 2019

У меня есть два класса, вложенных в другой класс, который является наблюдаемым объектом в представлении SwiftUI. Хотя свойства во вложенных классах объявлены как @Published, их значения (при их изменении) не обновляются в главном представлении.

Подобный вопрос был задан здесь, и я мог бы использовать его, чтобы получить егоработать для одного из двух подклассов, но не для обоих.

Как указать представлениям SwiftUI для привязки к вложенным объектам 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) работает для обновления изменений подмодели1, но не обоих:

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

То, что я ищу, - это какой-то способ передать изменения как подмодели 1, так и подмодели 2 на мой взгляд.

1 Ответ

0 голосов
/ 18 октября 2019

Вы можете расширить ответ на вопрос, с которым вы связались, используя 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()
        })
    }
}
...