NSUserDefaultsを介して対応する値が格納されたキー "" MyPreference "があるとします。
値が変更されたときに通知される方法はありますか?
それともバインディングを介して行うことができますか? (ただし、この場合は、値をUI要素にバインドする代わりに、オブジェクトに変更の通知を送信して、他のタスクを実行できるようにします。)
NSUserDefaultsDidChangeNotificationを監視できることは承知していますが、これはオールオアナッシングアプローチのようであり、変更された特定のキーと値のペアを取得するメカニズムがないようです。 (自由に修正してください。)
質問をしてから10分後に答えを探して一日中過ごしました...
Key-Value-Observingを通じてソリューションに出会った:
[[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")
}
そしてApple従業員はここでNSUserDefaultsDidChangeNotification通知を使用することを勧められました: https://devforums.Apple.com/message/237718#237718
@DenNukemに同意します。 NSKeyValueObservingOptionNewを使用していました。しかし、この関数は、他のオブジェクトを保存するためにNSUserdefaultを使用した場所にBADACCESS Code = 1エラーを出し始めました。 Key Value Observerを使用している場合は、NSUserDefaultsのゾンビの問題に注意してください。
これがソリューションへのリンクです: NSUserDefaultsおよびKVOの問題