【问题标题】:NSTextField autocompletion delegate method not called未调用 NSTextField 自动完成委托方法
【发布时间】:2011-04-02 19:06:01
【问题描述】:

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

- (NSArray *)control:(NSControl *)control
            textView:(NSTextView *)textView
         completions:(NSArray *)words
 forPartialWordRange:(NSRange)charRange
 indexOfSelectedItem:(NSInteger *)index

问题是这个方法永远不会被调用。我可以验证NSTextFielddelegate 设置是否正确,因为其他委托方法可以正常运行。

【问题讨论】:

    标签: objective-c cocoa nstextfield nstextview nscontrol


    【解决方案1】:

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

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

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

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

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

    一个简单的标志也可能无法做到这一点;似乎虽然重新发布了通知,但字段编辑器的string 不会改变——它只会响应直接键盘输入而改变。在我的自动完成实现中,我发现我必须保留“最后输入的字符串”的副本,并且每次都将其与字段编辑器的内容进行比较。

    【讨论】:

    • 你是如何考虑退格的?使用这个基本逻辑,每次按下退格键时都会触发自动完成代码,从而使其效果无效。
    • 您可以在control:textView:doCommandBySelector: 中使用退格键,并在必要时做一些不同的事情。 (我使用的控件是用于输入文件系统路径的字段,因此在我的情况下,用户不可能需要输入不在完成列表中的内容。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多