2

Cocoa Bindings を学んでいますが、問題が発生しました。バインディングの値が変更されたときにメソッドを呼び出す方法はありますか?

例:

NSStepperint を設定するために toをバインドしNSUserDefaultsていますが、int が変更されたときに他のものを更新できるようにする必要があります。オブジェクト コントローラから直接通知を受け取る方法はありますか? それとも、どういうわけか観察する必要がありNSStepperますか?
もしそうなら、どうすればいいですか?IB は、既にバインドされているときに私がそれをいじるのを好まないようです。

4

2 に答える 2

4

Key Value Observing (KVO)を使用して、NSUserDefaults を直接観察できます。次のように通知にサインアップします。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults addObserver:self forKeyPath:@"YourUserDefaultsKey" options:0 context:NULL];

@"YourUserDefaultsKey"次にこれを実装すると、値が変更されるたびに呼び出されます。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    if (object == userDefaults && [keyPath isEqualToString:@"YourUserDefaultsKey"]) {
        int intValue = [userDefaults intValueForKey:@"YourUserDefaultsKey"];
        // Do whatever you need to do with new intValue
    }
}

最後に、必要に応じてオブザーバーとしての登録を解除することを忘れないでください (例-dealloc: ):

- (void)dealloc
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults removeObserver:self forKeyPath:@"YourUserDefaultsKey"];
}

Cocoa Bindings 自体は KVO に基づいていることに注意してください。

免責事項: この回答のすべてのコードをブラウザーに入力しました。正しいはずですが、1 つまたは 2 つのタイプミスがある可能性があります。

于 2012-12-02T16:40:04.953 に答える
0

通知、通知センター、オブザーバー、@selector: を覚えていれば、作業は完了です。

編集:

int の変更は、そのクラスを通じて観察できます。IBまたはコードを介して、どのように実装するかはあなた次第です。

于 2012-12-02T15:18:52.327 に答える