微调NSTextField自动完成

时间:2014-11-30 11:54:16

标签: cocoa autocomplete nstextfield autosuggest nssearchfield

我使用NSControlTextEditingDelegate自动完成了什么 使用我生成的自定义建议在NSSearchField中键入。 complete:消息被发送到字段编辑器 当文字改变时。

现在我想微调自动完成的行为并拥有它 完全像Google搜索文本字段一样在Safari中工作:

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

    这意味着如果用户输入" San Fran"和谷歌API返回"圣 Francisco",从自动完成列表NSTextField值中选择它 取而代之的是#San; San San Francisco"。

    可能的解决方法包括重建包含完成的NSArray 并仅返回实际建议的后缀, 取决于charRange.location。这看起来很糟糕(因为自动完成 list现在只显示完成字符串的一部分),所以我想拥有 请求自动完成时NSTextField忽略空格。

  2. 从列表中选择自动完成,默认NSSearchField操作不是 发送。此时用户需要选择自动完成然后按 输入以触发搜索。

1 个答案:

答案 0 :(得分:1)

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

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

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

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