微调NSTextField自动完成

Ben*_*Uri 5 cocoa autocomplete nstextfield autosuggest nssearchfield

我正在使用NSControlTextEditingDelegate自动完成在NSSearchField中键入的内容以及生成的自定义建议。 complete:更改文本后,消息将发送到字段编辑器。

现在,我想微调自动补全的行为,使其完全像Safari中的Google搜索文本字段一样起作用:

  1. 在NSTextField中键入两个或多个单词(用空格分隔)时,传入的NSRange的位置在control:textView:textView:completions:forPartialWordRange: indexOfSelectedItem:键入最后一个空格之后开始。

    这意味着,如果用户键入“ San Fran”并且Google API返回“ San Francisco”,则从自动完成列表中选择它,将NSTextField值替换为“ San San Francisco”。

    可能的解决方法是重建包含完成的NSArray并仅返回实际建议的后缀,具体取决于charRange.location。这看起来很糟糕(因为自动完成列表现在仅显示完成字符串的一部分),因此我希望 NSTextField在请求自动完成时忽略空格。

  2. 从列表中选择自动完成功能,则不会发送默认的NSSearchField操作。目前,用户需要选择自动完成,然后按Enter触发搜索。

Zoë*_*son 2

您可以使用自定义字段编辑器来完成此操作,而不是完全依赖委托回调。

1) 覆盖rangeForUserCompletion并调整返回值,使其包含空格后面的文本。

2) 覆盖insertCompletion:forPartialWordRange:movement:isFinal,如果检查了 isFinal,则进行接受处理。

上面的步骤 (1) 将确定范围。如果您还设置索引completionsForPartialWordRange来填充编辑(或将其保留为默认 0),请使用空格键以及“/”和“.”。将接受当前选定的行,即使用户想要的是继续输入。要解决这个问题,在 中insertCompletion:forPartialWordRange:movement:isFinal,如果 isFinal 为 true,请检查[NSApp currentEvent]这些字符,如果找到它们,则跳过而不处理它或调用 super。