如何从视图中检测 BindableObjects 的变化?
How to detect changes to the BindableObjects from the View?
在 UIKit 中,我会有这样的代码:
@IBOutlet weak var itemNameField: UITextField!
@IBAction func itemNameFieldDone(_ sender: UITextField) {
thisItem.myName = sender.text ?? thisItem.myName
thisItem.modified()
}
在模型对象中:
func modified() {
dateModified = Date()
let cds = FoodyDataStack.thisDataStack
uuidUser = cds.uuidUser
uuidFamily = cds.uuidFamily
}
在 SwiftUI 中:
TextField($thisItem.myName)
陈述式的,漂亮而简短。当用户在 TextField 中键入内容时,SwiftUI 负责更新 myName
属性,但是如何让 dateModified
属性 同时更新?
您可以在项目类型声明中将 didSet
观察者添加到 myName
属性,然后从那里调用 modified
:
var myName: String = "" {
didSet {
self.modified()
}
}
使用包含 onEditingChanged
的 TextField
初始化程序,并在闭包中包含您需要的任何更新代码。
TextField($thisCategory.myName, placeholder: nil, onEditingChanged: { (changed) in
self.thisCategory.modified()
self.dataStack.didChange.send(self.dataStack)
}).textFieldStyle(.roundedBorder)
iOS14
有一个名为 onChange
的新修饰符可以检测任何状态的变化:
struct ContentView: View {
@State var text: String = ""
var body: some View {
TextField("Title", text: $text)
.onChange(of: text, perform: { value in
print(text)
})
}
}
在 UIKit 中,我会有这样的代码:
@IBOutlet weak var itemNameField: UITextField!
@IBAction func itemNameFieldDone(_ sender: UITextField) {
thisItem.myName = sender.text ?? thisItem.myName
thisItem.modified()
}
在模型对象中:
func modified() {
dateModified = Date()
let cds = FoodyDataStack.thisDataStack
uuidUser = cds.uuidUser
uuidFamily = cds.uuidFamily
}
在 SwiftUI 中:
TextField($thisItem.myName)
陈述式的,漂亮而简短。当用户在 TextField 中键入内容时,SwiftUI 负责更新 myName
属性,但是如何让 dateModified
属性 同时更新?
您可以在项目类型声明中将 didSet
观察者添加到 myName
属性,然后从那里调用 modified
:
var myName: String = "" {
didSet {
self.modified()
}
}
使用包含 onEditingChanged
的 TextField
初始化程序,并在闭包中包含您需要的任何更新代码。
TextField($thisCategory.myName, placeholder: nil, onEditingChanged: { (changed) in
self.thisCategory.modified()
self.dataStack.didChange.send(self.dataStack)
}).textFieldStyle(.roundedBorder)
iOS14
有一个名为 onChange
的新修饰符可以检测任何状态的变化:
struct ContentView: View {
@State var text: String = ""
var body: some View {
TextField("Title", text: $text)
.onChange(of: text, perform: { value in
print(text)
})
}
}