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];

第一个答案:为了清除视觉反馈,我可以做两件事中的任何一件。我可以取消视觉反馈...

[textFinder cancelFindIndicator];

或者我可以提醒 NSTextFinder 我即将更改我的 textView 内容...

[textFinder noteClientStringWillChange];

第二个答案:有一个全球性的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 回答