【发布时间】:2021-09-29 16:15:19
【问题描述】:
我有一个带有支持 ViewModel 的 SwiftUI 表单。我希望在 ViewModel 更改时启用保存按钮。我有以下代码:
class ViewModel: ObservableObject {
@Published var didUpdate = false
@Published var name = "Qui-Gon Jinn"
@Published var color = "green"
private var cancellables: [AnyCancellable] = []
init() {
self.name.publisher.combineLatest(self.color.publisher)
.sink { _ in
NSLog("Here")
self.didUpdate = true
}
.store(in: &self.cancellables)
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
NavigationView {
Form {
Toggle(isOn: self.$viewModel.didUpdate) {
Text("Did update:")
}
TextField("Enter name", text: self.$viewModel.name)
TextField("Lightsaber color", text: self.$viewModel.color)
}
.textFieldStyle(RoundedBorderTextFieldStyle())
.navigationBarItems(
trailing:
Button("Save") { NSLog("Saving!") }
.disabled(!self.viewModel.didUpdate)
)
}
}
}
这段代码有两个问题。
第一个问题是,在 ViewModel 实例化时,日志将显示“Here”,因此将 didUpdate 设置为 true。第二个问题是,当用户通过文本字段更改视图模型时,它实际上并没有触发发布者。
应该如何解决这些问题?
(我曾考虑将didSet{} 添加到 ViewModel 中的每个属性,但是当有很多属性时,这非常难看。我还考虑将修饰符添加到文本字段,但我真的更喜欢放置此代码在 ViewModel 中,因为网络更新也可能改变 ViewModel)。
【问题讨论】: