未调用NSTextField自动完成委托方法

ind*_*gie 8 cocoa objective-c nstextfield nstextview nscontrol

我实现了以下委托方法NSTextField来添加自动完成支持:

- (NSArray *)control:(NSControl *)control
            textView:(NSTextView *)textView
         completions:(NSArray *)words
 forPartialWordRange:(NSRange)charRange
 indexOfSelectedItem:(NSInteger *)index
Run Code Online (Sandbox Code Playgroud)

问题是这个方法永远不会被调用.我可以验证delegateNSTextField正确设置,因为其他的委托方法,他们应该发挥作用.

Jos*_*ell 7

您需要在某个时刻complete:调用文本字段的字段编辑器.这就是触发完成菜单的原因,但不会自动调用.如果您没有将F5绑定到任何内容,请尝试在您的字段中输入并点击它.完成应该触发; Option-Esc也可以工作.

如果你想要自动完成,它需要一些工作.你可以从这样的事情开始:

- (void)controlTextDidChange:(NSNotification *)note {
    if( amDoingAutoComplete ){
        return;
    } else {
        amDoingAutoComplete = YES;
        [[[note userInfo] objectForKey:@"NSFieldEditor"] complete:nil];
    }
}
Run Code Online (Sandbox Code Playgroud)

某种标志是必要的,因为触发完成将NSControlTextDidChangeNotification再次发布,这会导致调用,触发完成,这会更改控制文本,...

显然,你需要在某个时候取消标志.这取决于您希望如何处理用户与自动完成的交互 - 对于给定的开始字符串,可能只有一个完成,或者用户是否需要继续键入以缩小可能性(在这种情况下,您需要再次触发自动完成)?

一个简单的旗帜也许不会这样做; 似乎虽然重新发布了通知,但是字段编辑器string不会改变 - 它只会响应直接键盘输入而改变.在我的自动完成实现中,我发现我必须保留"最后输入的字符串"的副本,并将其每次与字段编辑器的内容进行比较.