Cocoa 微调NSTextField自动完成

Cocoa 微调NSTextField自动完成,cocoa,autocomplete,nstextfield,autosuggest,nssearchfield,Cocoa,Autocomplete,Nstextfield,Autosuggest,Nssearchfield,我正在使用NSControlTextEditingDelegate自动完成所需的操作 在NSSearchField中键入我生成的自定义建议。 complete:消息被发送到字段编辑器 当文本更改时 现在,我想微调自动完成的行为,并让它 与Safari中的Google搜索文本字段完全相同: 在NSTextField中键入两个或多个单词(用空格分隔)时, 传入的NSRange的位置控件:textView:textView:completions:forPartialWordRange: indexO

我正在使用NSControlTextEditingDelegate自动完成所需的操作 在NSSearchField中键入我生成的自定义建议。
complete:
消息被发送到字段编辑器 当文本更改时

现在,我想微调自动完成的行为,并让它 与Safari中的Google搜索文本字段完全相同:

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

    这意味着,如果用户键入“sanfran”,而googleapi返回“San” Francisco”,从自动完成列表中选择它NSTextField值为 替换为“旧金山”

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

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


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

    1) 重写
    rangeForUserCompletion
    并调整返回值,使其包含超过空白的文本

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


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

    遇到同一问题。默认情况下,通过在NSWindowDelegate的windowWillReturnFieldEditor中返回NSTextView的子类,可以替换自定义字段编辑器。