Хорошо, поэтому SwiftUI и ObservableObject, на iOS 13. У меня есть Модель, которая реализует ObservableObject:
class Model: ObservableObject {
@Published public var toggle: Bool = false
init() {
NSLog("Model init")
objectWillChange.sink { void in
NSLog("1 toggle \(self.toggle)")
}
$toggle.sink { v in
NSLog("2 toggle \(self.toggle) -> \(v)")
}
}
}
и Кнопка, которая переключает toggle
:
struct ContentView: View {
@ObservedObject var model: Model
var body: some View {
Button(action: {
self.model.toggle.toggle()
}, label: {Text(model.toggle ? "on" : "off")})
}
}
Теперь это работает. Вы нажимаете кнопку, и она переключается между «вкл» и «выкл». (Прежде чем сделать toggle
@Published
, это не так.) Однако ведение журнала не работает должным образом. Я получаю два журнала сразу при запуске: «Модель инициализации» и «2 переключения ложь -> ложь». Нажатие на кнопку, хотя и явно изменяющее значение toggle
, не приводит к выполнению любого из замыканий.
Когда представление изменяет вашу модель, я ожидаю, что будет способ получить информацию о изменение, если вам нужно, например, обновить вычисленные значения или syn c на диск или что-то еще. Возможно, sink
неправильный метод?
Как можно уведомить ObservableObject
с полями @Published
, когда его поля обновляются?