NSUserDefaultsDidChangeNotification:密钥的名称是什么,改变了什么?

smu*_*o78 8 xcode objective-c nsuserdefaults nsnotificationcenter ios

当UserDefaults中的某些值发生更改时,此代码将调用方法"defaultsChanged"

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
           selector:@selector(defaultsChanged:)  
               name:NSUserDefaultsDidChangeNotification
             object:nil];
Run Code Online (Sandbox Code Playgroud)

本规范将为我提供更改的价值

- (void)defaultsChanged:(NSNotification *)notification {
    // Get the user defaults
    NSUserDefaults *defaults = (NSUserDefaults *)[notification object];

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

但是如何才能获得密钥的名称,改变了?

auc*_*uco 30

正如其他人所说,无法从NSUserDefaultsDidChange通知中获取有关已更改密钥的信息.但是没有必要复制任何内容并自行检查,因为如果需要特别通知某个属性,还有与NSUserDefaults一起使用的Key Value Observing(KVO):

首先,注册KVO而不是使用NotificationCenter:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults addObserver:self
           forKeyPath:@"nameOfThingIAmInterestedIn"
              options:NSKeyValueObservingOptionNew
              context:NULL];
Run Code Online (Sandbox Code Playgroud)

不要忘记删除观察(例如在viewDidUnload或dealloc中)

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObserver:self forKeyPath:@"nameOfThingIAmInterestedIn"];
Run Code Online (Sandbox Code Playgroud)

最后实现此方法以接收KVO通知

-(void)observeValueForKeyPath:(NSString *)keyPath 
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context 
{
    NSLog(@"KVO: %@ changed property %@ to value %@", object, keyPath, change);
}
Run Code Online (Sandbox Code Playgroud)