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

Objective c 如何防止NSTextField或NSTextView在使用自动完成时自动选择第一项,objective-c,xcode,osx-mountain-lion,Objective C,Xcode,Osx Mountain Lion,我试图用autocomplete实现一个简单的NSTextField,它的行为更像JQuery UI autocomplete(),而不是NSSearchField的默认行为。两者之间的区别在于,使用JQuery UI,用户必须手动选择其中一个建议,然后才能在textfield中激活,而使用NS方法,则会自动选择第一个建议 原因是我将提供给用户的建议列表与文本不匹配,而是相关的。例如,如果用户键入“app”,而不是建议使用“apple”,我将建议使用“fruit”。不幸的是,在默认行为下,如果自

我试图用autocomplete实现一个简单的NSTextField,它的行为更像JQuery UI autocomplete(),而不是NSSearchField的默认行为。两者之间的区别在于,使用JQuery UI,用户必须手动选择其中一个建议,然后才能在textfield中激活,而使用NS方法,则会自动选择第一个建议

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

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

迄今为止找到的最接近的解决方案:

我想出来了。首先

control:textView:completions:forPartialWordRange:indexOfSelectedItem: 
我补充说:

*index = -1;
这会告诉自动完成不选择任何内容(如下所述:)

索引

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

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

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

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

我发现了这一点。首先

control:textView:completions:forPartialWordRange:indexOfSelectedItem: 
我补充说:

*index = -1;
这会告诉自动完成不选择任何内容(如下所述:)

索引

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

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

-(NSRange) rangeForUserCompletion {
    return NSMakeRange (0, 1);
}
这样可以确保替换整个搜索字符串,而不仅仅是最后一个单词