我有一个使用SwiftUI Form的ViewModel。当ViewModel改变时,我希望启用Save按钮。下面是代码:
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。第二个问题是当用户通过文本字段更改viewmodel时,它实际上不会触发发布器。
应该如何解决这些问题?
(我考虑了为ViewModel中的每个属性添加didSet{}
,但当有很多属性时,这样做非常丑陋。我也考虑过向文本字段添加修饰符,但我真的更喜欢将此代码放在ViewModel中,因为网络更新也可能更改ViewModel)。