ios – 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中.我究竟做错了什么?

解决方法

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

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

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

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...