NSTreeControllerを使用してNSOutlineViewに表示したいツリーのようなモデルがあります。
NSTreeControllerの挿入関数と削除関数を使用してモデルツリーを変更する限り、バインディングを設定でき、すべてが正常に機能します。モデルツリーに直接挿入またはモデルツリーから削除しようとすると、NSOutlineViewが更新されない場合があります。
展開されたオブジェクトのグループにオブジェクトを挿入すると、次のように機能します。
しかし、以前は子がなかったノードに最初のオブジェクトを追加しようとしても、何も起こりません。開示三角形が表示されていないため、展開して新しいノードを表示することはできません。
新しいオブジェクトでそのノードにカーソルを合わせると、ノードが展開され、問題なく2番目の子を追加できます。しかし、三角形はまだ見えません:
最後に、これらすべてのノードの親を閉じて再度開くと(リロードをトリガーすると)、三角形が突然表示されます。
そのため、三角形を表示するためにNSOutlineViewの行を手動でリロードする必要があるのか、それとも何かを台無しにしているのか疑問に思いました。ありがとう!!
アップデート:
私のNodeクラスに、次のような新しい子を追加します。
- (void)addChild:(MyNode *)child {
[self willChangeValueForKey:@"childNodes"];
[children addObject:child];
[self didChangeValueForKey:@"childNodes"];
}
そして、これらも実装しました(NSTreeController用にIBで設定しました)。
- (NSArray *)childNodes {
return [NSArray arrayWithArray:children];
}
- (NSInteger)countOfChildNodes {
return [children count];
}
- (BOOL)nodeIsLeaf {
return [children count] < 1;
}
childNodes
これは(特に)あまり最適化されていないことは知っていますが、最終バージョンでは子がC配列に格納されるため、現時点では実験中です。
更新2:
他の2つのプロパティについてもKVO通知を送信しようとしましたが、それも役に立ちませんでした。
- (void)addChild:(MyNode *)child {
NSLog(@"%@", NSStringFromSelector(_cmd));
[self willChangeValueForKey:@"nodeIsLeaf"];
[self willChangeValueForKey:@"countOfChildNodes"];
[self willChangeValueForKey:@"childNodes"];
[children addObject:child];
[self didChangeValueForKey:@"childNodes"];
[self didChangeValueForKey:@"countOfChildNodes"];
[self didChangeValueForKey:@"nodeIsLeaf"];
}