NSTextField自动完成方法

时间:2011-06-19 18:39:10

标签: objective-c macos autocomplete delegates nstextfield

我在触发NSTextfield的complete:方法时遇到问题。

现在我可以使用@distinctUnionOfObjects从文本字段中创建一个不同的名称数组(删除数组重复项的真棒方法),现在我可以使用以下命令发送回文本字段的自动完成:  - (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index

但是,这种方法不是自动的,我必须按 ESC 按钮在数据输入过程中弹出文本字段的自动完成建议。

我在这里搜索了一些对我没用的例子。

简短问题: 是否有任何方法使用 NSTexfields委托(如controlDidChanged或类似的东西来更轻松,更清楚地执行此操作?

我只是使用complete:方法混淆nstextview。

2 个答案:

答案 0 :(得分:7)

我不建议复制整个字符串。这对你的情况很好,但如果你使用自动完成大文本文件,那么你将遇到各种性能和内存问题。您可以跟踪您是否处于更新中。如果您有多个文本视图,则可以为isCompleting变量创建一个字典。

- (void) controlTextDidChange: (NSNotification *)note {
    NSTextView * fieldEditor = [[note userInfo] objectForKey:@"NSFieldEditor"];

    if (!isCompleting) {
        isCompleting = YES;
        [fieldEditor complete:nil];
        isCompleting = NO;
    }
}

答案 1 :(得分:4)

当您的文字字段委托获得controlTextDidChange:时,您可以在Field Editor上致电complete:。这是按ESC或F5时调用的方法。

- (void) controlTextDidChange: (NSNotification *)note {
    NSTextView * fieldEditor = [[note userInfo] objectForKey:@"NSFieldEditor"];

    [fieldEditor complete:nil];
}

棘手的部分是,当导航完成菜单时,它将导致controlTextDidChange:消息再次发送(尽管不更改实际字符串),这将创建无限循环。当你已经处于完成阶段时,你将需要某种标志来阻止complete:被调用。例如,您可以跟踪用户对字符串所做的最后一次更改,并将其与字段编辑器的当前值进行比较;如果没有用户发起的更改,请不要导致完成:

BOOL textDidNotChange = [lastTypedString isEqualToString:[fieldEditor string]];

if( textDidNotChange ){
    return;
}
else {
    lastTypedString = [[fieldEditor string] copy];
    [fieldEditor complete];
}