5

NSTextView検索バー ( ) を使用する があります[textView setUsesFindBar:YES];

2 つの質問があります。

  1. 検索操作から視覚的なフィードバックをクリアするにはどうすればよいですか?

    プログラムで textView のコンテンツを変更すると、問題が発生します。以前のコンテンツに対する検索操作の視覚的なフィードバックは、コンテンツの変更後も残ります。明らかに、これらの黄色のボックスは新しいコンテンツには適用されないため、textView コンテンツを変更するときにそれらをクリアする方法が必要です。

    注: NSTextFinderClient プロトコルは実装しませんでした。単純な textView があり、検索バーは他に何もしなくても機能するからです。

  2. 検索文字列を検索バーに送信するにはどうすればよいですか?

4

1 に答える 1

14

私は自分の答えを見つけたので、他の人のためにここにそれを行う方法があります.

まず、制御できるように NSTextFinder のインスタンスが必要です。それをコードで設定します。

textFinder = [[NSTextFinder alloc] init];
[textFinder setClient:textView];
[textFinder setFindBarContainer:[textView enclosingScrollView]];
[textView setUsesFindBar:YES];
[textView setIncrementalSearchingEnabled:YES];

最初の回答: 視覚的なフィードバックをクリアするには、2 つの方法のいずれかを実行できます。視覚的なフィードバックをキャンセルできます...

[textFinder cancelFindIndicator];

または、textView コンテンツを変更しようとしていることを NSTextFinder に警告できます...

[textFinder noteClientStringWillChange];

2 番目の回答: グローバル NSFindPboard があります。それを使用して検索を設定できます。

// change the NSFindPboard NSPasteboardTypeString
NSPasteboard* pBoard = [NSPasteboard pasteboardWithName:NSFindPboard];
[pBoard declareTypes:[NSArray arrayWithObjects:NSPasteboardTypeString, NSPasteboardTypeTextFinderOptions, nil] owner:nil];
[pBoard setString:@"new search" forType:NSStringPboardType];
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSTextFinderCaseInsensitiveKey, [NSNumber numberWithInteger:NSTextFinderMatchingTypeContains], NSTextFinderMatchingTypeKey, nil];
[pBoard setPropertyList:options forType:NSPasteboardTypeTextFinderOptions];

// put the new search string in the find bar
[textFinder cancelFindIndicator];
[textFinder performAction:NSTextFinderActionSetSearchString];
[textFinder performAction:NSTextFinderActionShowFindInterface]; // make sure the find bar is showing

しかし、問題があります。そのコードの後、検索バーの実際のテキスト フィールドは更新されません。ファーストレスポンダーを切り替えると、更新できることがわかりました...

[myWindow makeFirstResponder:outlineView];
[myWindow makeFirstResponder:textView];
于 2012-12-14T08:52:29.140 に答える