我有以下代码旨在捕获针对特定键更改 NSUserDefaults 值的事件。
[[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:SOME_NSSTRING_VARIABLE
options:NSKeyValueObservingOptionNew
context:NULL];
- (void)observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{NSLog (@"Changed for key %@", keyPath); }
但是永远不会调用 observeValueForKeyPath。我什至尝试用 Observing value changes to an NSUserDefaults key 中提到的字符串替换 SOME_NSSTRING_VARIABLE但它没有帮助。
更新: 我正在从 tabview 更改 NSUserDefaults。上面监听变化的代码在同一个tabviewcontroller的不同tab中。在我监视更改的选项卡(上面代码存在的选项卡)中,如果我添加:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// NSLog(@"viewillappear");
NSUserDefaults *FUDefaults = [NSUserDefaults standardUserDefaults];
NSLog(@"The username obtained is: %@", [FUDefaults objectForKey:SOME_NSSTRING_VARIABLE]);
}
已正确获取更新后的 NSUserDefaults 值,但从未调用过 observeValueForKeyPath。
最佳答案
编辑:viewDidUnload
现已弃用,请使用 dealloc
代替 removeObserver
这应该可以完美运行,我刚刚在这里测试过。
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:@"SomeKey"
options:NSKeyValueObservingOptionNew
context:NULL];
// Testing...
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"test" forKey:@"SomeKey"];
[defaults synchronize];
}
- (void)viewDidUnload
{
[super viewDidUnload];
[[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"SomeKey"];
}
- (void)observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{
if([keyPath isEqual:@"SomeKey"])
{
NSLog(@"SomeKey change: %@", change);
}
}
你可以测试的东西。
在 viewDidUnload 中放置一个断点并确保 View 不会在您身上消失(因为您正在从另一个 viewController 更改
SomeKey
)如果是这种情况,那么可能会移动您的寄存器/根据您的 VC 的工作方式将代码取消注册到 init/dealloc。使用像
这样的替换@"SomeKey"
这样的显式 KeyPath 而不是像SOME_NSSTRING_VARIABLE
关于iOS NSUserDefaults 观察单个键值的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10784439/