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)
| 归档时间: |
|
| 查看次数: |
12860 次 |
| 最近记录: |