如何从视图中检测对 BindableObjects 的更改?
Posted
技术标签:
【中文标题】如何从视图中检测对 BindableObjects 的更改?【英文标题】:How to detect changes to the BindableObjects from the View? 【发布时间】: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
属性同时更新?
【问题讨论】:
也许在模型中放一个二传手? docs.swift.org/swift-book/LanguageGuide/Properties.html#ID260 错误@NSManaged not allowed on observing properties
【参考方案1】:
使用包含onEditingChanged
的TextField
初始化程序,并在闭包中包含您需要的任何更新代码。
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 不允许观察属性。以上是关于如何从视图中检测对 BindableObjects 的更改?的主要内容,如果未能解决你的问题,请参考以下文章