具体详细说明NSUserDefaultsDidChangeNotification上的默认值已更改

时间:2011-09-09 10:08:24

标签: nsuserdefaults nsnotifications

我开始进入NSUserDefaults的内部密室,现在我可以使用提供的选择器和NSNotification对象作为参数成功拦截NSUserDefaultsDidChangeNotification通知。但是,返回的NSNotification对象不会像我预期的那样出现。

我期待的是:

1)从通知中心接收NSUserDefaultsDidChangeNotification。

2)询问返回的提供的NSNotification对象,以获取包含至少一个键/值对的用户信息,其中key =“当您睡着时,以下默认值已更改”和object =“NSArray已采用新值的应用程序键。”

我得到的是:

1)如上所述

2)UserInfo = nil! (任何人都知道为什么......?)

我的应用代表是NSUserDefaultsDidChangeNotification的注册响应者,因此会将更改分发到需要了解其设置不同的任何对象。在我开始编写自己的代码以检测哪些密钥受到用户默认值更改影响之前,有人可以告诉我; (a)是否必须确定自己发生了哪些变化 - 或者我是否遗漏了一些非常明显的变化? (b)任何人都可以指出我的一些文档(除了开发文档!),它提供了如何以Apple批准的方式处理NSUserDefaultsDidChangeNotification的示例?如果可能的话,我不想重新发明轮子。我已经抛弃了返回的NSNotification对象的dictionaryRepresentation - 但显然,它包含了Apple自己的所有键/值。 再次感谢,提前。 V.V。

2 个答案:

答案 0 :(得分:4)

您可以使用 KVO(键值编码)来跟踪NSUserDefaults中的特定键。 请参阅我的回答,其中包含代码段:https://stackoverflow.com/a/10950217/388412

您可以注册以观察NSUserDefaults standardUserDefaults对象的特定键的键值更改,而不是注册为NSNotificationCenter中任何NSUserDefaultsDidChangeNotifications的一般观察者。

答案 1 :(得分:3)

看看Apple的文档: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

最后有一个通知部分说明:

  

NSUserDefaultsDidChangeNotification   当对持久域中的默认值进行更改时,将发布此通知。   通知对象是NSUserDefaults对象。此通知不包含userInfo字典。

所以NIL userInfo字典是Apple的选择。如果您真的想要此功能,我建议您通过http://bugreport.apple.com/

向Apple提交评论

我最终通过编写一些逻辑来比较通知中的设置与我加载的设置,让我知道哪些更改了。