我有开关,我想检测是否有任何开关改变了位置,如果做了更改,我需要开始我的行动。
切换存储位置NSUserDefaults
- (IBAction)saveSwitch:(id)sender
{
NSUserDefaults *defs1 = [NSUserDefaults standardUserDefaults];
[defs1 setBool: blackSwitch.on forKey: @"blackKey"];
NSUserDefaults *defs2 = [NSUserDefaults standardUserDefaults];
[defs2 setBool: greenSwitch.on forKey: @"greenKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
答案 0 :(得分:5)
您可以在致电synchronize
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyAppSettingsChanged" object:self userInfo:nil];
然后在你的其他课堂上听取通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppSettingsChanged:) name:@"MyAppSettingsChanged" object:nil];
-(void) onAppSettingsChanged:(NSNotification)notification
{
// settings changed
}
如果需要,可以在调用包含哪些设置已更改的信息的NSDictionary
时将postNotificationName
传递给userInfo。
答案 1 :(得分:3)
如果您使用的是NSUserDefaults,最简单的方法是订阅NSUserDefaultsDidChangeNotification。当事情发生变化时会自动发送。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appSettingsDidChange:)
name:NSUserDefaultsDidChangeNotification
object:nil];
答案 2 :(得分:2)
跟踪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
),那么它也会通过初始值通知您的观察者方法,从而允许您重复使用该方法初始状态。
Swift版
设置默认值:
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.
}
}
答案 3 :(得分:0)
您无法检测NSUserDefaults中的更改。相反,跟踪交换机本身何时更改,并处理该事件。例如:
[blackSwitch addTarget:self
action:@selector(blackSwitchChanged:)
forControlEvents:UIControlEventValueChanged];
处理开关位置变化:
- (IBAction)blackSwitchChanged:(id)sender {
NSLog(@"Black switch changed");
..
// check if blackSwitch is on or off.
}