好的,所以在 iOS 13 上,SwiftUI
和 ObservableObject
。我有一个实现 ObservableObject
的 Model
:
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
之前,它不起作用。)但是,日志记录并不按预期工作。我在启动时立即获取两个日志:“Model init”和“2 toggle false->false”。虽然点击按钮似乎改变了toggle
的值,但没有导致任何一个闭包执行。当视图改变模型时,我希望有一种方式通知更改,以防需要更新计算值或同步到磁盘等操作。也许sink
方法是错误的?
@Published
字段的ObservableObject
如何在其字段更新时得到通知?
didSet
,但也很好知道如何使用objectWillChange
一次性监控所有内容。objectDidChange
也许也不错,但我认为默认情况下我们没有这个选项。 - Erhannis