如何检测NSUserDefault中的更改?

时间:2012-06-06 18:21:20

标签: ios xcode switch-statement nsuserdefaults

我有开关,我想检测是否有任何开关改变了位置,如果做了更改,我需要开始我的行动。

切换存储位置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];
}

4 个答案:

答案 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.
}