NSUserDefaults的iOS版观看值的一个关键的变化(iOS NSUserDefaults

2019-06-24 21:29发布

我有以下代码,旨在赶上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从未被调用。

Answer 1:

编辑: 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,并确保该观点并没有消失在你(因为你正在改变SomeKey从其他的viewController)如果是这样的话,那么也许将您登记/撤销注册代码为初始化/的dealloc取决于你如何VC工程。

  • 使用明确的keyPath像@"SomeKey"不是像替代SOME_NSSTRING_VARIABLE



Answer 2:

斯威夫特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")
}


Answer 3:

斯威夫特版本:

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")
}


文章来源: iOS NSUserDefaults Watching the change of values for a single key