我有一个为我的应用程序实现首选项面板的典型案例,但我遇到了检测任何首选项值更改的问题。在我的情况下,我不想自动应用更改,因此我已设置
[[NSUserDefaultsController sharedUserDefaultsController] setAppliesImmediately:NO];
我还将我的偏好设置面板中的所有控件绑定到 sharedUserDefaultsController 。
然后我在偏好设置面板中有一个取消和一个应用按钮,如果对 sharedUserDefaultsController 值进行了任何更改,我只想启用“应用”按钮。
所以我想我可以将 sharedUserDefaultsController 的 hasUnappliedChanges 绑定到我的Apply按钮启用属性。但 hasUnappliedChanges 仅返回 true ,即使未进行任何更改也是如此。或者实际上,只要我不加载我的首选项面板窗口,它就会返回 false 。但只要窗口加载并且达到 awakeFromNib , hasUnappliedChanges 就会返回 true 。从那以后,我无法将其重置为 false 。如果我保存 sharedUserDefaultsController 并不重要。
所以我的问题是:
如何正确检测 sharedUserDefaultsController 的任何值是否已更改?
将控件绑定到 sharedUserDefaultsController 时 hasUnappliedChanges 是否有效?
感谢我能得到的任何帮助。
修改
我尝试观察 NSUserDefaultsDidChangeNotification ,但只在将值保存到用户默认值后才发布更新。换句话说,在我打电话之后
[(NSUserDefaultsController*)[NSUserDefaultsController sharedUserDefaultsController] save:sender];
所以,除非我使用这种错误的方式,否则我无法说清楚。