我为NSTextField
实现了以下委托方法,以添加自动完成支持:
- (NSArray *)control:(NSControl *)control
textView:(NSTextView *)textView
completions:(NSArray *)words
forPartialWordRange:(NSRange)charRange
indexOfSelectedItem:(NSInteger *)index
问题是这个方法永远不会被调用。我可以验证delegate
的{{1}}是否设置正确,因为其他委托方法的功能正常。
答案 0 :(得分:7)
您需要在某个时刻在文本字段complete:
上调用field editor。这就是触发完成菜单的原因,但不会自动调用。如果您没有将F5绑定到任何内容,请尝试在您的字段中输入并点击它。完成应该触发; Option-Esc也可以使用。
如果您希望自动完成,则需要一些工作。你可以从这样的事情开始:
- (void)controlTextDidChange:(NSNotification *)note {
if( amDoingAutoComplete ){
return;
} else {
amDoingAutoComplete = YES;
[[[note userInfo] objectForKey:@"NSFieldEditor"] complete:nil];
}
}
某种标志是必要的,因为触发完成会使NSControlTextDidChangeNotification
再次发布,这会导致调用它,触发完成,这会更改控制文本,...
显然,你需要在某个时候取消标志。这将取决于您希望如何处理用户与自动完成的交互 - 对于给定的开始字符串可能只有一个完成,或者用户是否需要继续键入以缩小可能性(在这种情况下您需要再次触发自动完成)?
一个简单的旗帜可能也不会这样做;似乎虽然通知重新发布,但字段编辑器的string
不会发生变化 - 它只会响应直接键盘输入而改变。在我的自动完成实现中,我发现我必须保留“最后输入的字符串”的副本,并将其每次都与字段编辑器的内容进行比较。