1

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

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

4 回答 4

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在调用时传递一个到 userInfopostNotificationName中,其中包含诸如哪些设置已更改之类的信息。

于 2012-06-06T19:14:32.183 回答
3

如果您使用的是 NSUserDefaults ,最简单的方法是订阅NSUserDefaultsDidChangeNotification。它会在发生变化时自动发送。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(appSettingsDidChange:)
                                             name:NSUserDefaultsDidChangeNotification
                                           object:nil];
于 2013-11-28T08:58:57.447 回答
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) 中,那么它也会将初始值通知您的观察者方法,即使对于初始状态,您也可以重用该方法。


斯威夫特版本

设置默认值:

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.
    }
}
于 2014-09-11T14:51:17.077 回答
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.
}
于 2012-06-06T18:53:42.153 回答