NSUserDefaults和KVO问题

J0o*_*0o0 9 ios

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

NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
[settings synchronize];
[settings addObserver:self forKeyPath:@"pref_server" options:NSKeyValueObservingOptionNew context:NULL];
Run Code Online (Sandbox Code Playgroud)

以及要通知的方法:

- (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");
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ver 17

我建议使用适当的通知:NSUserDefaultsDidChangeNotification.

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

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

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(defaultsChanged:)
                                             name:NSUserDefaultsDidChangeNotification
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)


小智 7

有趣的观察:

[NSUserDefaults standardUserDefaults]KVO现在似乎是顺从的,因为我能够观察并绑定它的值.我正在运行10.7.2,使用Xcode 4.2, SDK 10.7, LLVM compiler 3.00.

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

  • 问题是关于[tag:ios]. (3认同)