【问题标题】:How to detect changes to the BindableObjects from the View?如何从视图中检测对 BindableObjects 的更改?
【发布时间】:2019-06-16 10:50:36
【问题描述】:

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

声明性的,漂亮而简短。 SwiftUI 会在用户在 TextField 中键入时更新 myName 属性,但是如何让 dateModified 属性同时更新?

【问题讨论】:

标签: swiftui


【解决方案1】:

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

TextField($thisCategory.myName, placeholder: nil, onEditingChanged: { (changed) in
                    self.thisCategory.modified()
                    self.dataStack.didChange.send(self.dataStack)
                }).textFieldStyle(.roundedBorder)

【讨论】:

    【解决方案2】:

    iOS 14

    有一个名为onChange 的新修饰符可以检测任何状态的变化:

    struct ContentView: View {
    
        @State var text: String = ""
    
        var body: some View {
            TextField("Title", text: $text)
                .onChange(of: text, perform: { value in
                    print(text)
                })
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以在项目类型声明中将didSet 观察者添加到myName 属性,然后从那里调用modified

      var myName: String = "" {
                  didSet {
                      self.modified()
                  }
              }
      

      【讨论】:

      • 错误@NSManaged 不允许观察属性。
      猜你喜欢
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多