【问题标题】:NSTextField with auto-suggestions like Safari's address bar?带有 Safari 地址栏等自动建议的 NSTextField?
【发布时间】:2021-11-04 06:29:08
【问题描述】:

NSTextField 在用户键入时在其下方动态显示“推荐列表”的最简单方法是什么?就像 Safari 的地址栏有某种菜单(我很确定 Safari 的地址栏建议是菜单,因为它有圆角、蓝色渐变选择和背景模糊)。

我尝试过使用NSTextView's autocompletion facility,但发现它不够用:

  • 它会尝试补全单词而不是整个文本字段 - 换句话说,选择自动补全建议只会替换当前单词。
  • 它会向前推动自动完成列表并将其与插入点对齐,而不是使其与文本字段对齐。

在上面的示例屏幕截图中,每当我选择自动完成建议时,文本字段只会将K 替换为列表中的建议项目,结果为Abadi Abadi Kurniawan

这些是我想要实现的目标:

  • Whenever a suggestion is selected, the entire text field is replaced with the suggestion.
  • 保持建议列表与文本字段的左侧对齐。

注意:这不是关于adding progress indicator behind a text field的问题。

【问题讨论】:

    标签: macos cocoa autocomplete safari nstextfield


    【解决方案1】:

    Safari 地址栏使用单独的窗口。苹果有示例项目CustomMenus,定制它只需要一两个小时。

    开发者会议解释必须做什么Key Event Handling in Cocoa Applications

    如果您希望能够选择多个单词,您需要提供自己的 FieldEditor(学分应该留给其他人)

    - (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(nullable id)client;
    {
        if ([client isKindOfClass:[NSSearchField class]])
        {
            if (!_mlFieldEditor)
            {
                _mlFieldEditor = [[MLFieldEditor alloc] init];
                [_mlFieldEditor setFieldEditor:YES];
            }
            return _mlFieldEditor;
        }
        return nil;
    }
    
    
    -  (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];
        }
    }
    

    【讨论】:

    • 感谢您的链接!但它看起来有点过时了。你知道什么新的吗?最好是快速版本:) 谢谢
    • @JM_Developer 只知道私有框架 Suggestion.framework 不是我一直在寻找。如果你发现了什么,请发布一个新的答案。 github.com/xhruso00/MapkitSearchFieldOSX
    • @JM_Developer 本教程似乎在做类似的事情:youtube.com/watch?v=3iuHMd0-8BI
    • 原理相同——子窗口。将 Lucas 的代码视为演示而不是生产就绪(尝试在建议窗口中放置鼠标等)。苹果代码 95% 已准备好生产。就我个人而言,我很怀念 2010 年之前的那些高质量示例代码
    【解决方案2】:

    这仅解决了您答案的一半,但我相信您需要继承 NSTextView 并实现 - (NSRange)rangeForUserCompletion 方法,返回文本字段中整个字符串的范围。这应该确保它不只是自动完成最近输入的单词。

    如果你想要一个自定义菜单,你必须自己做,可能通过实现 -controlTextDidChange: 方法并在适当的时候显示一个带有表格的自定义视图。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2021-09-06
      • 1970-01-01
      • 2019-12-30
      • 2017-05-24
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多