如何从视图中检测对 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】:

使用包含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 不允许观察属性。

以上是关于如何从视图中检测对 BindableObjects 的更改?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何检测视图控制器是不是在弹出或关闭后出现

如何在单元格下方的表格视图中检测点击/触摸?

如何以编程方式检测 iPhone 6 和 6 Plus 视图模式 [重复]

如何从“更多”标签栏项目中的编辑检测标签栏项目更改?

iOS如何在弹出顶视图控制器时以编程方式检测?

检测特定视图是不是为 webview