我找到了我的答案,所以对于其他人来说,这是如何做到的。
首先,您需要一个 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];