我在我的应用中使用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中。我做错了什么?
答案 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开始,这有效并且有记录:
响应默认值更改
您可以使用键值观察来获知特定默认值的任何更新。