7

这个问题看起来很简单,但我已经尝试了我能想到的所有东西,并且搜索了几个小时。

我有一个自动完成的 NSSearchField,基本上是复制 Apple 的SearchField 示例代码。我在 IB 中关闭了“发送整个搜索字符串”,因为我不想在用户完成他们的文本输入之前进行搜索,并且不想进行多次搜索(它们很昂贵)。

当用户在字段中键入时,当他们按下回车键时,指定他们接受当前的自动完成,我希望 NSSearchField 的动作触发。相反,它似乎只是填写了自动完成功能,然后用户必须再次按 Enter 才能触发该操作。基本上,考虑开始在 Safari 中输入 URL,它会自动完成,然后按 Enter 开始加载页面(触发操作)。他们无需再次按 Enter 键即可开始加载页面。

我尝试过但没有成功的事情:

  • control:textView:commandSelector:, 寻找 insertNewline:。当他们按回车键完成自动完成时,它不会被触发
  • 覆盖 controlTextDidEndEditing:。和上面一样

有任何想法吗?谢谢!

4

1 回答 1

7

我想出了如何使这项工作。

您需要覆盖 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 使用第一个自动完成列表条目覆盖输入的字符串?

于 2011-03-19T06:18:48.793 回答