如何接收NSUserDefaultsDidChangeNotification iPhone通知

23

经过大量搜索,我没有找到是否需要将字典对象传递给:

[NSUserDefaultsDidChangeNotification addObserver: forKeyPath: options: context:];

如果我想在userDefaults发生单个更改时收到通知,那么在选项中应提供什么?另外,什么是keypath?

1个回答

66

NSUserDefaultsDidChangeNotification 是在默认设置更改时发送的通知。要监听它,您需要使用以下代码:

NSUserDefaultsDidChangeNotification仅仅是一个当默认设置发生变化时被发送出去的通知。如需监听此通知,您需要使用以下代码:

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
               selector:@selector(defaultsChanged:)  
                   name:NSUserDefaultsDidChangeNotification
                 object:nil];
这将在通知被触发时调用defaultsChanged:方法。您需要按照以下方式实现此方法:
- (void)defaultsChanged:(NSNotification *)notification {
    // Get the user defaults
    NSUserDefaults *defaults = (NSUserDefaults *)[notification object];

    // Do something with it
    NSLog(@"%@", [defaults objectForKey:@"nameOfThingIAmInterestedIn"]);
}

13
在dealloc方法中移除观察者是很重要的。如果一个已销毁的类仍然被注册为观察者,那么当有通知时,应用程序将会崩溃。使用代码:[[NSNotificationCenter defaultCenter] removeObserver:self]; - maralbjo
1
@deanWombourne:在defaultsChanged方法中,当你说“// 在此处处理!”时,你如何获取通知中的信息?它没有userInfo,类参考文档也这样写。 - Ziggy
10
有没有办法知道哪个用户默认设置已更改? - user843337
@deanWombourne 我刚刚发现扩展程序不会触发组通知。我打算尝试使用MMWormhole来解决这个问题。 - Sebastian Flückiger
@SebastianFlückiger 他们可能只会在扩展程序内触发通知 - 你可能不会在主应用程序中收到相应的通知。唉。我从未听说过MMWormHole,但它看起来很有趣。祝好运! - deanWombourne
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接