Cocoa - NSUserDefaults值的变化通知?

Sir*_*tty 52 cocoa notifications preferences

假设我有一个密钥@"MyPreference",通过NSUserDefaults存储相应的值.

修改值时有没有办法通知?

或者可以通过绑定来完成?(但是这种情况下,我不希望将值绑定到UI元素,而是希望我的对象被通知更改,以便我可以执行其他任务.)

我知道可以观察到NSUserDefaultsDidChangeNotification,但这似乎是一种全有或全无的方法,并且似乎没有一种机制来获取被修改的特定键值对.(随意纠正.)

Sir*_*tty 80

花了一整天寻找答案,只是在提问后10分钟才发现...

通过Key-Value-Observing得出解决方案:

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
    forKeyPath:@"values.MyPreference"
    options:NSKeyValueObservingOptionNew
    context:NULL];
Run Code Online (Sandbox Code Playgroud)

或者,更简单(以下评论):

[[NSUserDefaults standardUserDefaults] addObserver:self
                                        forKeyPath:@"MyPreference"
                                           options:NSKeyValueObservingOptionNew
                                           context:NULL];
Run Code Online (Sandbox Code Playgroud)

  • 您也可以在`[NSUserDefaults standardUserDefaults]`上调用此方法,而不必在前面添加"值".到关键路径.其他参数保持不变. (14认同)
  • 我无法让它工作,因为Quin建议使用`[NSUserDefaults standardUserDefaults]`.但是,字符串append不需要作为`... forKeyPath:@"values.MyPreference"...`将起作用.此外,您还需要实现` - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)对象更改:(NSDictionary*)更改上下文:(void*)context;`实际捕获事件. (6认同)
  • 我,我刚刚在iOS上尝试过它并且有效. (2认同)

Bri*_*ian 19

迅速:

override func viewDidLoad() {
  super.viewDidLoad()
  NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "THE KEY", options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
  // your logic
}

deinit {
  NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "THE KEY")
}
Run Code Online (Sandbox Code Playgroud)


Den*_*kem 9

Apple员工建议在此处使用NSUserDefaultsDidChangeNotification通知:https://devforums.apple.com/message/237718#237718

  • 这样做的缺点是,您无法知道设置的更改. (8认同)
  • 是的,您认为他们至少会在NSUserDefaultsDidChangeNotification的userInfo字典中放置已更改的密钥,但是没有:"此通知不包含userInfo字典." 更糟糕的是,发布NSUserDefaultsDidChangeNotification的唯一规范是,它是在"持久域名更改时"发布的.我可能需要20分钟的研究才能确切地确定这意味着什么,然后我不确定我是否会相信它. (2认同)