1

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

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

是否可以防止自动选择第一项?下面列出了我找到的最接近的解决方案。虽然它确实可以防止文本被覆盖,但我宁愿根本不选择任何项目,因为该列表是有效条目的列表,并且通过显示用户作为第一个项目键入的内容,它会错误地指示输入始终有效。因此,换句话说,我正在尝试使用自动完成功能来加快输入速度并将输入限制为有效条目。

迄今为止找到的最接近的解决方案: 如何防止 NSSearchField 使用第一个自动完成列表条目覆盖输入的字符串?

4

1 回答 1

1

我想通了。首先在...

control:textView:completions:forPartialWordRange:indexOfSelectedItem: 

我补充说:

*index = -1;

这告诉自动完成不选择任何东西(如此处所述:NSTextView Class Reference

指数

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

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

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

这样可以确保替换整个搜索字符串,而不仅仅是最后一个单词。

于 2012-12-10T05:41:56.780 回答