Objective c 如何判断NSUserDefaultsController sharedUserDefaultsController的值是否已更改

Objective c 如何判断NSUserDefaultsController sharedUserDefaultsController的值是否已更改,objective-c,xcode,macos,cocoa,cocoa-bindings,Objective C,Xcode,Macos,Cocoa,Cocoa Bindings,我有一个为我的应用程序实现首选项面板的典型案例,但在检测任何首选项值的更改时遇到了问题。在我的情况下,我不想自动应用更改,所以我设置了 [[NSUserDefaultsController sharedUserDefaultsController] setAppliesImmediately:NO]; 我还将首选项面板中的所有控件绑定到了sharedUserDefaultsController 然后在我的首选项面板中有一个取消按钮和一个应用按钮,我只想在对sharedUserDefaultsC

我有一个为我的应用程序实现首选项面板的典型案例,但在检测任何首选项值的更改时遇到了问题。在我的情况下,我不想自动应用更改,所以我设置了

[[NSUserDefaultsController sharedUserDefaultsController] setAppliesImmediately:NO];
我还将首选项面板中的所有控件绑定到了sharedUserDefaultsController

然后在我的首选项面板中有一个取消按钮和一个应用按钮,我只想在对sharedUserDefaultsController值进行任何更改时启用应用按钮

因此,我想我可以将我的sharedUserDefaultsController的hasUnappliedChanges绑定到我的Apply buttons enable属性。但是未应用的更改仅返回true,即使未进行任何更改。或者,只要我不加载我的首选项面板窗口,它就会返回false。但是,一旦加载窗口并从NIB唤醒它,就有未应用的更改返回true。从那以后,我无法将其重置为false。无论我是否保存sharedUserDefaultsController

因此,我的问题是:

  • 如何正确检测sharedUserDefaultsController的任何值是否已更改

  • 当您将控件绑定到sharedUserDefaultsController时,是否有未应用的更改起作用

谢谢你给我的任何帮助


编辑

我尝试观察nsUserDefaultsIDChangeNotification,但只有在将值保存到用户默认值后才会发布更新。换句话说,在我打电话之后

[(NSUserDefaultsController*)[NSUserDefaultsController sharedUserDefaultsController] save:sender];

因此,除非我使用了这种错误的方法,否则就我所知,这种方法是行不通的。

看起来您需要发送一条“
applyChanges:
消息”,尽管我不认为这是一种实例方法。也许他们的意思是“提交”?是的,我读过参考资料,但我认为applyChanges是一个打字错误,我认为他们的意思是“保存”(我实际上已经向苹果发送了关于它的反馈)。我还没有试着去做。我会试试看是否有用。谢谢你的建议。嗯,是的,
save
可能就是他们的意思<代码>提交是一种NSControl实例方法。我现在看到您提到了执行
保存
。我的第一个直觉是,这不会立即应用,绑定是不兼容的,因为绑定总是反映数据模型,但您认为它们会在引用中提到这一点。Committediting没有做到这一点。坦率地说,我不知道NSUserDefaultsController如何进行未经许可的更改。如果它能按我想的那样工作,那就太好了,但显然不是这样,所以我想我只能努力解决它了。不过,感谢您的输入。每当我更改默认设置时,我都会亲自发布自己的通知,而不是依赖cocoa内置的任何东西。如果你自己写代码。。。你会明白它是如何工作的。这样的话,虫子就少了。