我有一个包含NSTextFields,日期选择器和NSPopupButton的表单。我想仅在用户更改了这些控件的值时才提供保存功能。那么如何跟踪可可的变化呢?我想过使用Key Value Observing分析每个控件的值属性,然后它会触发以编程方式指定的值(如默认值)的通知。那么任何想法如何处理这种情况?
答案 0 :(得分:2)
对于您的文本字段,使您的窗口或视图控制器成为字段的委托,然后实现-controlTextDidChange:
,并在那里启用保存。如果您需要根据编辑的文本字段执行不同的操作,则可以从传入的通知对象中检索它。
NSPopupButtons是按钮,因此它们使用target:action模式。在控制器中实现IBAction方法,然后将弹出按钮连接到它。如果对每个按钮执行相同的操作,则可以对多个弹出按钮使用相同的操作方法(例如,只需启用保存按钮和/或菜单项)。
在为控件设置默认值时,您仍可能会收到虚假通知,具体取决于您的操作方式。如果是这样,只需将一个BOOL属性添加到控制器,称为changeTrackingDisabled
或类似。设置默认值(或恢复到上次保存状态)时将其设置为YES,完成后将其设置为NO。然后在每个注意到更改的方法中,检查该属性的状态。
我个人认为在这种情况下使用代表和行动比KVO更有效。 KVO的API leaves something to be desired,并且往往会增加组件之间的耦合,因为您必须使用字符串静态编码您希望观察的所有属性的路径。 This blog post对专业人士进行了深入的讨论。缺点