Cocoaバインディング、というかメソッド名長いっての
Cocoaバインディングというか keyValue Observingは以前は
[self setKeys:[NSArray arrayWithObjects:@"mode", @"arg1", @"arg2", nil] triggerChangeNotificationsForDependentKey:@"fire"];
のようなのを 例えば +initializeとかで呼び出して登録すれば Notifyが行く仕様だったんだけど、気がついたらdeprecatedになってる!わあ、いつの間に。全然気がついてなかった。
で、新しい方法は、っていうとこれまた長い keyPathsForValuesAffectingValueForKeyとやらをオーバーライドして、聞かれたKeyに対して、observeするkeyがあればNSSetで申告するらしい。
+ (NSSet *) keyPathsForValuesAffectingValueForKey: (NSString *) key { NSSet keys = nil; NSLog(@"%@", key); //おためし if ([key isEqualToString:@"fire"]) { keys=[NSSet setWithObjects: @"mode", @"arg1", @"arg2", nil]; } return keys; }
なんかかえって面倒になったようだけど*1、前のsetKeys:triggerChangeNotificationsForDependentKey:だと、どこで呼び出すべきかがちょっとびみやうだったのと、自由度が高くなるからこうしたのかな。外にリリースする訳でもないし前のまんまにしとこっかな・・・とかすると後々ハマるのかな。
ところで、上のコメントで「おためし」とある奴を出してみたんだけど、
2009-04-24 04:23:35.930 kepstrum[4784:10b] fire 2009-04-24 04:23:35.931 kepstrum[4784:10b] arg1 2009-04-24 04:23:35.932 kepstrum[4784:10b] arg1 2009-04-24 04:23:35.932 kepstrum[4784:10b] arg2 2009-04-24 04:23:35.933 kepstrum[4784:10b] arg2 2009-04-24 04:23:35.933 kepstrum[4784:10b] mode 2009-04-24 04:23:35.934 kepstrum[4784:10b] mode
? なんで2回なんだろう。nib上で参照された回数なのかな。よくわかんねや。なやもう。
追記:
2回でてる奴は keyPaths...が返したやつか。だからfireだけ1回なのね。
*1:本当は superの keyPaths...を呼び出して、それにAppendするべき。更に面倒