如何告诉用户更改了cocoa中控件的值

时间:2013-04-12 16:18:12

标签: objective-c macos cocoa

我有一个包含NSTextFields,日期选择器和NSPopupButton的表单。我想仅在用户更改了这些控件的值时才提供保存功能。那么如何跟踪可可的变化呢?我想过使用Key Value Observing分析每个控件的值属性,然后它会触发以编程方式指定的值(如默认值)的通知。那么任何想法如何处理这种情况?

1 个答案:

答案 0 :(得分:2)

对于您的文本字段,使您的窗口或视图控制器成为字段的委托,然后实现-controlTextDidChange:,并在那里启用保存。如果您需要根据编辑的文本字段执行不同的操作,则可以从传入的通知对象中检索它。

NSPopupButtons是按钮,因此它们使用target:action模式。在控制器中实现IBAction方法,然后将弹出按钮连接到它。如果对每个按钮执行相同的操作,则可以对多个弹出按钮使用相同的操作方法(例如,只需启用保存按钮和/或菜单项)。

在为控件设置默认值时,您仍可能会收到虚假通知,具体取决于您的操作方式。如果是这样,只需将一个BOOL属性添加到控制器,称为changeTrackingDisabled或类似。设置默认值(或恢复到上次保存状态)时将其设置为YES,完成后将其设置为NO。然后在每个注意到更改的方法中,检查该属性的状态。

我个人认为在这种情况下使用代表和行动比KVO更有效。 KVO的API leaves something to be desired,并且往往会增加组件之间的耦合,因为您必须使用字符串静态编码您希望观察的所有属性的路径。 This blog post对专业人士进行了深入的讨论。缺点