NSTextFinder在NSTextView中的作用

3
我正在尝试在我的自定义NSTextView子类中捕获所有NSTextFinderClient调用。我的-(void)performTextFinderAction:(id)sender覆盖中调用了show操作,但对于查找下一个、查找上一个等操作,则没有调用。
有什么想法吗?
谢谢!
编辑:
如果您创建一个新项目并从界面构建器中拖动NSTextView,则在查找栏成为第一响应者时,command-g和command-shift-g(查找下一个和查找上一个)不起作用。
为什么会这样?
我需要一个自定义的NSTextView子类来响应每个事件中的查找栏。
2个回答

3

我在苹果的TextEdit源代码中搜索,因为在TextEdit中,即使搜索字段是第一响应者,文本视图中的标准搜索栏也可以正常工作,例如使用command-G(和其他快捷键)。

我找到了解决方案。

前往主菜单的nib文件,并选择“查找”(以及相关)菜单项。它们应该绑定到默认操作“performFindPanelAction:”。现在取消绑定并将它们绑定到第一响应者的“performTextFinderAction:”上。

您可能无法在第一响应者的操作列表中找到该操作。因此,您需要在第一响应者的属性检查器面板中自己添加它。

下面的文档所说的就是这个意思:

在OS X v10.7之前,这些菜单项的默认操作是performFindPanelAction:。尽可能更新您的实现以使用此新操作。

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/#//apple_ref/occ/instm/NSResponder/performTextFinderAction


我可以将 performFindPanelAction: 添加到 FirstResponder 的 action 列表中,但它还要求填写 action 方法的类型。在单击“+”按钮后安装的默认值是“id”。需要更改吗?action 方法不返回任何值,所以这个“类型”是什么意思?它是指方法的单个参数的类型吗? - jsbox
我本来想说 performTextFinderAction:。无论如何,当我滚动浏览这个长列表的名称时,我注意到在所有类名中间有一个 FirstResponder,于是我使用了它。现在看起来像广告一样工作。 - jsbox

2

查找栏与客户端的NSTextFinder进行私有通信,而不是调用NSResponder的-performTextFinderAction:方法。这是必要的,以便在除客户端之外的其他事物具有键焦点时,查找功能仍能正常工作。

你想要达到什么目标?


我有文本折叠功能。当有人寻找被折叠的特定文本时,我需要展示它。因此,我需要捕捉这些查找发生的时间。 - Dexter
2
NSTextFinder总是在想要突出显示新匹配项时发送-scrollRangeToVisible:。您能否在该方法的覆盖中展开文本(然后调用super)? - kperryua
其他东西也会经常被击中吗? - Dexter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接