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中的键值观察。
- 从webView到JavaScript的回调:在本机代码和html之间共享数据
- configuration文件 – 请求超时Xcode
- 我的Base Internationalization storyboard是否必须对应所有非本地化语言和string的后备语言?
- 当我重写Modern Objective-C中的setter和getters时,错误地访问生成的ivars
- 我可以在信号处理程序中做什么?
- NSURLSession最大#同时下载,无论主机如何
- UIPageController与UIPageControl结合?
- 为每个屏幕自定义NavigationController的后退button
- 如何将核心数据中的实体保存并应用关系?