追蹤NSUserDefaults
更改的最佳方式是使用KVO添加觀察者。這樣您就不需要執行任何自定義通知代碼或手動跟蹤更改。
在想要的類有關更改的通知只是把它註冊爲一個監聽到指定的鍵:
[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"blackKey" options:NSKeyValueObservingOptionNew context:nil];
[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"greenKey" options:NSKeyValueObservingOptionNew context:nil];
然後,只需對該通知的回覆:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (object == defaults) {
// Here you can grab the values or just respond to it with an action.
}
}
現在,每當一個這些密鑰更改會自動通知您。
這是一個超級乾淨的解決方案,並允許一些重用。例如,如果將NSKeyValueObservingOptionInitial
鍵添加到上面的options
參數(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
)中,那麼它也會通知您的觀察者方法具有初始值,即使對於初始狀態,也允許您重新使用該方法。
斯威夫特版本
設置的默認值:
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "blackKey", options: .New, context: nil)
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "greenKey", options: .New, context: nil)
觀察員:
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if object is NSUserDefaults {
// Here you can grab the values or just respond to it with an action.
}
}
非常感謝! –
現在我遇到了一個問題,因爲我有8個開關,當我更改例如5個開關位置時,它發佈了5個通知。有沒有辦法只發佈一個通知? –
SaveSwitch是否連接到小部件?除非您有某種保存按鈕,否則每次都必須提高事件數量 - 或者在關閉對話框時保存併發布通知。 – tumtumtum