5

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

现在我想微调自动完成的行为,让它完全像谷歌搜索文本字段在 Safari 中一样工作:

  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 操作。目前用户需要选择一个自动完成,然后按回车触发搜索。

4

1 回答 1

2

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

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

2)覆盖insertCompletion:forPartialWordRange:movement:isFinal,如果 isFinal 被选中,做你的接受处理。

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

于 2019-07-18T18:52:01.737 回答