cocoa – 通知NSUserDefaults值的变化?

比方说,我有一个键“MyPreference”,通过NSUserDefaults存储相应的值。

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

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

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

花了整整一天的时间寻找答案,只有10分钟后才发现问题…

通过键值观测来find解决scheme:

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.MyPreference" options:NSKeyValueObservingOptionNew context:NULL]; 

或者更简单地说(下面的评论):

 [[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"MyPreference" options:NSKeyValueObservingOptionNew context:NULL]; 

迅速:

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

苹果员工build议在这里使用NSUserDefaultsDidChangeNotification通知: https ://devforums.apple.com/message/237718#237718

我同意@DenNukem。 我正在使用NSKeyValueObservingOptionNew。 但是,为了保存其他对象,无论我使用NSUserdefault,该函数都开始向我提供BADACCESS Code = 1错误。 如果你正在使用Key Value Observer,只要注意NSUserDefaults上的Zombie问题。

以下是解决scheme的链接: NSUserDefaults和KVO问题