ios - NSUserDefaults 和 KVO 问题

标签 ios

我在我的应用程序中使用 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];

关于ios - NSUserDefaults 和 KVO 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714161/

相关文章:

ios - UIScrollView 可以缩放,但不能平移

ios - NSDateFormatter 返回 Null

ios - UITextView 末尾的额外空间

iphone - 执行 segue 时未加载下一个 View Controller

ios - Cordova 编译错误

ios - Restkit .20 请求超时间隔

ios - AFNetworking Reachability 在网络状态改变时显示 UIView

iphone - didFinishLaunchingWithOptions 有什么作用?

ios - 如何在 UICollectionView 上面实现内容 View

ruby-on-rails - 从 Rails 获取 JSON/XML 到 iOS (xcode 4) TableView