我正在尝试使用来 self 的自定义 NSSearchField 的搜索查询在 NSTextView 中实现搜索。
听起来很简单,但我无法让它工作。
到目前为止,我已经浏览了所有有关 NSTextFinder
、其客户端和 FindBarContainer 的 Apple 文档。 TextFinder 只是向容器提供 FindBarView,当您激活搜索时容器会显示它。
客户端、容器和 TextFinder 之间的所有通信都是隐藏的。它看起来就像一个黑匣子,旨在“按原样”工作,无需任何定制或干扰。
但是 NSTextFinder 的 - (void)performAction:(NSTextFinderAction)op
方法呢?不是为了向 TextFinder 发送自定义命令吗?
我试图使用以下内容为其分配一个新的搜索字符串:
NSPasteboard* pBoard = [NSPasteboard pasteboardWithName:NSFindPboard];
[pBoard declareTypes:[NSArray arrayWithObjects:NSPasteboardTypeString, NSPasteboardTypeTextFinderOptions, nil] owner:nil];
[pBoard setString:_theView.searchField.stringValue forType:NSStringPboardType];
NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSTextFinderCaseInsensitiveKey,
[NSNumber numberWithInteger:NSTextFinderMatchingTypeContains], NSTextFinderMatchingTypeKey,
nil];
[pBoard setPropertyList:options forType:NSPasteboardTypeTextFinderOptions];
[textFinder performAction:NSTextFinderActionSetSearchString];
但这不起作用,只会破坏正常的 findBar 操作。
我有一种强烈的感觉,我做错了什么。 我想要的只是在我自己的 NSSearchField 中拥有标准搜索功能。这可能吗?
我敢打赌我不是第一个对普通 findBar 不满意的人。
非常需要并感谢您的帮助!
最佳答案
对于 NSTextView 来说,NSTextFinder 主要只是 NSString 的 func range(of searchString: String, options mask: NSString.CompareOptions = [], range rangeOfReceiverToSearch: NSRange) -> NSRange 的用户界面。
如果您想在 NSTextView 上实现自己的搜索,请使用它。要向前搜索,您可以构建一个范围,从当前选择范围的末尾开始,一直到 NSTextView 文本的末尾。要向后搜索,请构造一个从 0 开始到当前选择范围的开头的范围,并告诉 NSString 使用向后搜索。
如果 NSString 返回 .notFound
范围,请自行实现环绕。
如果您需要 startsWith
、endsWith
或 wholeWord
,您需要获取 NSString 的 func 给您的结果,检查是否它就可以了,如果不行,调整范围并再次调用。
关于cocoa - NSTextView + NSTextFinder + 我单独的 NSSearchField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24724629/