如何防止NSTextField或NSTextView在使用自动完成时自动选择第一项

时间:2012-11-15 04:33:55

标签: objective-c xcode osx-mountain-lion

我正在尝试使用自动完成功能实现一个简单的NSTextField,其行为更像是一个JQuery UI自动完成(http://jqueryui.com/autocomplete/),而不是NSSearchField的默认行为。两者之间的区别在于,使用JQuery UI,用户必须在文本字段中变为活动之前手动选择其中一个建议,而使用NS方法时,将自动选择第一个建议。

原因是我将向用户提供的建议列表与文本不匹配,而是相关。例如,如果用户键入“app”,而不是建议“apple”,我会建议“水果”。不幸的是,使用默认行为,如果第一个项目被自动选中,那么文本字段将在建议时立即变为“水果”,这不是所需的行为(我希望它保持为“app”直到用户自己选择“水果”。

是否可以防止第一个项目被自动选中?我找到的最接近的解决方案如下所示。虽然它确实阻止了文本被覆盖,但我宁愿根本没有选择任何项目,因为列表是有效条目的列表,并且通过显示用户键入的第一项,它会错误地指示输入始终有效。换句话说,我试图使用自动完成来加速输入以及将输入限制为有效条目。

到目前为止找到最近的解决方案: How to prevent NSSearchField from overwriting entered strings using the first autocompletion list entry?

1 个答案:

答案 0 :(得分:1)

我想出来了。首先是......

control:textView:completions:forPartialWordRange:indexOfSelectedItem: 

我补充说:

*index = -1;

这告诉自动填充不选择任何内容(如此处所述:NSTextView Class Reference

  

索引

     

输入时,一个整数变量,默认值为0.输出时,   您可以将此值设置为返回数组中的索引指示   应该在最初选择哪个项目。将值设置为-1到   表示不应该有初始选择。

然后,我遇到的另一个问题是,如果在搜索字段中输入多个单词,则自动完成仅替换最后一个单词,而所需的行为是替换整个搜索字符串。为了解决这个问题,我将NSTextView子类化并添加了以下方法:

-(NSRange) rangeForUserCompletion {
    return NSMakeRange (0, 1);
}

这确保替换整个搜索字符串而不是最后一个字。