我在触发NSTextfield的complete:
方法时遇到问题。
现在我可以使用@distinctUnionOfObjects
从文本字段中创建一个不同的名称数组(删除数组重复项的真棒方法),现在我可以使用以下命令发送回文本字段的自动完成:
- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index
但是,这种方法不是自动的,我必须按 ESC 按钮在数据输入过程中弹出文本字段的自动完成建议。
我在这里搜索了一些对我没用的例子。
简短问题:
是否有任何方法使用 NSTexfields委托(如controlDidChanged
或类似的东西来更轻松,更清楚地执行此操作?
我只是使用complete:
方法混淆nstextview。
答案 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];
}