我想出了如何使这项工作。
您需要覆盖 NSTextViews 的 NSFieldEditor。
要提供一个覆盖的版本,在 NSWindow 的委托中:
- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client
{
if ([client isKindOfClass:[NSSearchField class]])
{
if (!_mlFieldEditor)
{
_mlFieldEditor = [[MLFieldEditor alloc] init];
[_mlFieldEditor setFieldEditor:YES];
}
return _mlFieldEditor;
}
return nil;
}
_mlFieldEditor 是一个实例变量。这是定义:
@interface MLFieldEditor : NSTextView
@end
@implementation MLFieldEditor
- (void)insertCompletion:(NSString *)word forPartialWordRange:(NSRange)charRange movement:(NSInteger)movement isFinal:(BOOL)flag
{
// suppress completion if user types a space
if (movement == NSRightTextMovement) return;
// show full replacements
if (charRange.location != 0) {
charRange.length += charRange.location;
charRange.location = 0;
}
[super insertCompletion:word forPartialWordRange:charRange movement:movement isFinal:flag];
if (movement == NSReturnTextMovement)
{
[[NSNotificationCenter defaultCenter] postNotificationName:MLSearchFieldAutocompleted object:self userInfo:nil];
}
}
@end
关键部分是 [super insertCompletion...] 之后的 NSReturnTextMovement。
第一部分将对其进行更改,以便键入空格键不会执行自动完成,这是我所做的评论:
如何防止 NSSearchField 使用第一个自动完成列表条目覆盖输入的字符串?