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

У меня есть представление SwiftUI, которое принимает объект EnvironmentObject с именем appModel. Затем он читает значение 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, но я бы хотел избежать этого, если это возможно.

Ответы [ 2 ]

4 голосов
/ 16 октября 2019

Вложенные модели еще не работают в 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()
        }
    } 
}

В основном ваш AppModel отлавливает событие из Submodel и отправляет его дальше в View

Редактировать:

Если вам не нужно SubModel, чтобы быть в классе, то вы можете попробовать что-то вроде этого:

struct Submodel{
    var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: Submodel = Submodel()
}
0 голосов
/ 22 октября 2019

Похоже, ошибка. Когда я обновляю xcode до последней версии, он работает правильно при привязке к вложенным объектам ObservableObjects

...