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 件のコメント:
コメントを投稿