【问题标题】:How to make NSSearchField send action upon autocompletion?如何让 NSSearchField 在自动完成时发送动作?
【发布时间】:2011-03-02 05:13:42
【问题描述】:

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

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

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

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

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

有什么想法吗?谢谢!

【问题讨论】:

    标签: objective-c cocoa autocomplete nstextfield nssearchfield


    【解决方案1】:

    我想出了如何做到这一点。

    您需要覆盖 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。

    第一部分将对其进行更改,以便键入空格键不会执行自动完成,这是我所做的评论: How to prevent NSSearchField from overwriting entered strings using the first autocompletion list entry?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2012-11-19
      • 2012-06-07
      • 2016-07-05
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多