NSUserDefaults和KVO问题

我在我的应用程序中使用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中设置的项目标识符。 我究竟做错了什么?

我build议使用适当的通知: NSUserDefaultsDidChangeNotification 。

在XCode的Apple文档中searchAppPrefs,它将显示一个示例应用程序,它正是您想要做的事情。 只需编译并运行! 它使用NSUserDefaultsDidChangeNotification 。

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

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

有趣的观察:

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

我似乎无法在发行说明中的​​任何位置find这种新行为。

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

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

虽然没有很好的文档,NSUserDefaults支持在iOS7中的键值观察。