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

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キーを追加すると ( )、オブザーバー メソッドにも初期値が通知されるため、初期状態でもそのメソッドを再利用できます。optionsNSKeyValueObservingOptionInitial | 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 に答える