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)
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)
Apple员工建议在此处使用NSUserDefaultsDidChangeNotification通知:https://devforums.apple.com/message/237718#237718