iOS NSUserDefaults 观察单个键值的变化

标签 ios nsuserdefaults

我有以下代码旨在捕获针对特定键更改 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/

相关文章:

ios - 我可以安全地从 iOS 7 调用 iOS 8 选择器吗?

ios - 找不到 AppDelegate 类

ios - UISplitViewController 委托(delegate)从未调用

ios - UITableView - 如何识别我是否将单元格拖到单元格上?

ios - NSUserDefaults 不保存在类变量的 setter 中

ios - 如何保持一共得到了多少分

iphone - 围绕 UITableView 的一部分的阴影

ios - 偶尔的 NSUserDefaults 麻烦

iphone - 当应用程序更新时,NSUserDefaults 是否会被删除?

arrays - 追加到 UserDefaults 数组 (Swift)