我有以下代码,旨在赶上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永远不会获取调用。 我甚至尝试用细绳替代SOME_NSSTRING_VARIABLE也为中提到观测值变为一个关键NSUserDefaults的 ,但它并没有帮助。
更新:我从一个TabView的改变NSUserDefaults的。 上面的代码来监视更改是在同一tabviewcontroller的不同标签。 在我监视的变化(其中,上面的代码中存在的标签),如果我添加的标签:
- (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);
}
}
事情你可以测试。
斯威夫特3版本:
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults.standard.addObserver(self, forKeyPath: "keyPath", options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "keyPath" {
//Do something
}
}
deinit {
UserDefaults.standard.removeObserver(self, forKeyPath: "keyPath")
}
斯威夫特版本:
func setUserDefaultsListener(){
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "keyPath", options: NSKeyValueObservingOptions.New, context: nil)
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "keyPath" {
//Do something
}
}
deinit {
NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "keyPath")
}