NSUserDefaults和KVO问题

时间:2011-04-19 09:18:17

标签: ios

我在我的应用中使用NSUserDefaults,我希望在更改特定值时收到通知。为此,我在viewDidLoad中添加了以下行:

NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
[settings synchronize];
[settings addObserver:self forKeyPath:@"pref_server" options:NSKeyValueObservingOptionNew context:NULL];

要通知的方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{

    NSLog(@"Change");

    NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
    if (object == settings && [keyPath isEqualToString:@"pref_server"])
    {
        NSLog(@"Server did change");
    }

}

不幸的是,后者永远不会被调用... @“pref_server”是我在Root.plist中设置的项目标识符,位于Settings.bundle中。我做错了什么?

5 个答案:

答案 0 :(得分:17)

我建议您使用相应的通知:NSUserDefaultsDidChangeNotification

在Xcode中的Apple文档中搜索AppPrefs,它将显示一个示例应用程序,它完全符合您的要求。只需编译并运行!它使用NSUserDefaultsDidChangeNotification

这是用于注册观察者的代码:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(defaultsChanged:)
                                             name:NSUserDefaultsDidChangeNotification
                                           object:nil];

答案 1 :(得分:6)

有趣的观察:

[NSUserDefaults standardUserDefaults]现在似乎符合KVO,因为我能够观察并绑定它的值。我使用Xcode 4.2, SDK 10.7, LLVM compiler 3.0运行10.7.2。

我似乎无法在发行说明的任何地方找到这种新行为。

答案 2 :(得分:3)

虽然没有详细记录,NSUserDefaults确实支持iOS7中的键值观察。

答案 3 :(得分:2)

NSUserDefaults不符合KVO,但NSUserDefaultsController是。所以你要使用:

NSUserDefaultsController *defaultsc = [NSUserDefaultsController sharedUserDefaultsController];
[defaultsc addObserver:self forKeyPath:@"values.pref_server" 
               options:NSKeyValueObservingOptionNew 
               context:NULL];

答案 4 :(得分:1)

从iOS 11.3开始,这有效并且有记录:

  

响应默认值更改

     

您可以使用键值观察来获知特定默认值的任何更新。