2008年2月20日

Cocoa Binding の canAdd はいつ呼ばれるのか?

NSArrayController/NSTreeController の canAdd/canInsert が呼ばれるタイミングが、素直ではないような気がする。

仕様なのだろうか?

canRemove や canAddChild/canInsertChild などは、それぞれのコントローラの選択(selection)が変化した毎に呼ばれる。

canAdd/canInsertも同じようなタイミングで呼ばれると思うのだが、呼ばれない、、、何故!

素直な期待を満たす動作にするためには、それぞれの派生コントローラを作って、KVOを使って下記のようにしてみた。

@interface CustomController : NSArrayController {  
}
@end

@implementation CustomController

- (void)awakeFromNib
{
    [self addObserver:self
           forKeyPath:@"selection"
              options:0 context:nil];
}

- (void) observeValueForKeyPath:(NSString *)keyPath
                   ofObject:(id)object
                     change:(NSDictionary *)change
                    context:(void *)context
{
    if ([keyPath isEqualToString:@"selection"]) {
        [self willChangeValueForKey:@"canAdd"];
        [self didChangeValueForKey:@"canAdd"];
        [self willChangeValueForKey:@"canInsert"];
        [self didChangeValueForKey:@"canInsert"];
    }
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
@end

setKeys:triggerChangeNotificationsForDependentKey:を使っても同じことが出来ると思うが、同じ動作は実現できなかった、、、canAdd/canInsert は Controller Key だからなのかぁ。そもそも canRemove はどうしてるのだろうかぁ、、、

全く分からん。

0 件のコメント: