問題の背景:
NSOutlineViewがあり、すべてのtableColumnがプログラムでNSTreeControllerのarrangedObjectsにバインドされているため、selectionIndexPathsをバインドする必要はありません。NSTreeControllerのarrangedObjectsのソースはmutableArrayです。- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath;
メインスレッドで実行することにより、すべてのノードを動的にNSTreeControllerに追加しています。NSOutlineViewのmouseDownイベントを次のようにオーバーライドしました。
- (void)mouseDown:(NSEvent *)event { /*...myMethods...*/ [super mouseDown:event]; }
問題:
ノードが非常に高速に追加され、outlineViewでmouseDownイベントを実行すると、次の状況が頻繁に発生します。
TreeControllerにノードを追加するスレッドは、mouseDownイベントによって呼び出されるシーケンス(おそらく)を中断するため、そのinsertObject: atArrangedObjectIndexPath:
前に呼び出されsetSelectionIndexPaths:
ます。そのため、outlineViewの新しい選択は消え、treeControllerには古いバージョンのselectedIndexPathsが残っています。
私は1つの部分的な解決策を試しました:outlineView全体を変更できないように、insertObject:
メソッドを(で)ブロックしましたが、スレッドの競合が発生し、アプリがフリーズすることがよくあります。@synthesized(outlineView)
選択範囲が消える問題を解決する方法はありますか?