2

多くの人が知っているかもしれませんが、アウトラインビューにバインドされたNSTreeControllerは、コアデータエンティティを表示しているときに重複を表示できます。

一時的な解決策は、述語に'parent == nil'を追加することですが、これは親エンティティのみを返します。たとえば、ユーザーがサブエンティティを検索している場合、要求されたサブエンティティは表示されません。

(提案された)解決策は、NSTreeControllerをサブクラス化し、現在表示されているエンティティを追跡するNSMutableSet変数を追加することです。この変数は、initで割り当て、deallocで解放する必要があります。

「fetchWithRequest:merge:error:」が呼び出されたら、セットを空にする必要があります(これを解放して再度割り当てるよりも効率的かどうかはわかりません)。エンティティが表示に追加されるたびに、セットにエンティティが含まれているかどうかを確認してください。そうでない場合は、追加します。それ以外の場合は、ルートに近い方(サブエンティティ)を見つけて、そのサブエンティティの場合はスキップするか、以前に含まれていたものと交換します。

パフォーマンスへの影響は比較的少ないはずだと思います(NSSetがハッシュを使用していることを考慮して)。私が抱えている問題は、この動作を追加するためにオーバーライドする正しいメソッドを見つけることです。具体的には、「fetchWithRequest:merge:error:」が呼び出された後、NSTreeControllerがフェッチされたエンティティを処理します。

4

2 に答える 2

1

ツリー構造を失うことなく、検索語でツリーをフィルタリングする方法を本当に探していると言っても過言ではありませんか?固有の問題(ツリーコントローラーに検索一致の親ノードを含めるように強制する以外に)は、親が実際に検索結果と一致する場合と一致しない場合があるため、表示が混乱することです。

あなたの方がUIの問題だと思いますね。その場合、最善のアプローチ(そして私が多くの有名な企業や独立した開発者が採用しているのを見てきました)は、検索結果をプレーンなテーブルに表示することです。このようにして、結果をさまざまな属性で並べ替えることができ、検索モードのアウトラインビューでドラッグアンドドロップを無効にする必要はありません(ツリーの一部のみがコンテキスト外に表示されているときにユーザーがツリー構造を変更しようとするのを防ぐため) )。

于 2010-07-03T14:21:00.197 に答える
0

Joshuaの答えを拡張して、検索機能を自分自身に実装することができましたNSOutlineViewが、ビュー内のルート/親オブジェクトに限定されていました。

(ジョシュアが言ったように)すべてのオブジェクトをフィルタリングしたい場合は、結果をで表示する必要があると思いますNSTableView

于 2010-08-10T15:12:12.893 に答える