2

この質問は以前に尋ねられたようですが、答えはありませんでした。NSSearchField で NSTreeController をフィルタリングすることは可能ですか? もしそうなら、どのように?

ありがとう!

4

1 に答える 1

4

あなたの質問が「NSArrayController がバインディング インスペクターを使用するのと同じように、IB で実行できますか?」という場合、答えは「いいえ」です。IB はバインディングが可能であることを示唆していますが (実際のバインディングは可能です)、NSTreeController には述語がないため、例外が生成されます。

サブクラスを実装することで可能になるはずですが、フィルタリングプロセスがデータのツリー構造に影響を与えるため、少し難しいでしょう。

編集:実際には少しのコードで実行できます。ビュー コントローラーを NSSearchField のデリゲートとして設定していると仮定すると、デリゲートに次のメソッドを実装します。

- (void)controlTextDidEndEditing: (NSNotification *)aNotification {
    NSPredicate *aPredicate = nil;
    if ([[[self mySearchField] stringValue] isEqualToString:@""]) {
        aPredicate = [NSPredicate predicateWithFormat: @"parent == nil"];
    } else {
        aPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", [[self mySearchField] stringValue]];
    }
    [[self myTreeController] setFetchPredicate: aPredicate];
    [[self myOutlineView] reloadData];
}

上記は、名前属性に基づいてツリーをフィルタリングします。ツリー ビューをフィルタリングすると、ツリー構造に奇妙な影響が及ぶ可能性があることに注意してください。また、空の文字列が提示されると、メソッドは、データソースからトップ レベルのエントリをフィルター処理し、ツリー ビューを復元する既定の述語を作成することにも注意してください。

于 2011-12-04T18:58:14.210 に答える