如何从视图中检测 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()
            }
        }

使用包含 onEditingChangedTextField 初始化程序,并在闭包中包含您需要的任何更新代码。

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)
            })
    }
}