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