cocoa - NSTextView + NSTextFinder + 我单独的 NSSearchField

标签 cocoa search nstextview nssearchfield

我正在尝试使用来 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 范围,请自行实现环绕。

如果您需要 startsWithendsWithwholeWord,您需要获取 NSString 的 func 给您的结果,检查是否它就可以了,如果不行,调整范围并再次调用。

关于cocoa - NSTextView + NSTextFinder + 我单独的 NSSearchField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24724629/

相关文章:

swift - 如何为 NSWindow 的标题栏着色

objective-c - 将 NSPopUpButtonCell 与 NSTableView 一起使用

objective-c - 如何更改 IKImageBrowserView 的双击行为?

jquery - mySql查询搜索和替换

php - 在ElasticSearch中搜索

objective-c - 有没有办法在给定表格中选定单元格的行和列索引的情况下获取 NSCell 对象?

search - 在搜索结果中组织大量数据

swift - 在 Swift 的 NSTextView 上用 Markdown 替换子字符串

cocoa - NSTextView 中插入符号下方的 NSPopover

swift - NSTextView:应用段落样式