追踪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