带有 Safari 地址栏等自动建议的 NSTextField?

Posted

技术标签:

【中文标题】带有 Safari 地址栏等自动建议的 NSTextField?【英文标题】:NSTextField with auto-suggestions like Safari's address bar? 【发布时间】: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的问题。

【问题讨论】:

【参考方案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: 方法并在适当的时候显示一个带有表格的自定义视图。

【讨论】:

以上是关于带有 Safari 地址栏等自动建议的 NSTextField?的主要内容,如果未能解决你的问题,请参考以下文章

带有 FCM 推送通知的 Safari [重复]

带有 textarea 错误的移动 Safari 滚动至

macbook 无论用safari还是chrome下载 点击下载后下载的目标地址出现在地址栏而网页时空白的,不会自动下载

如何通过javascript插件/扩展程序隐藏地址栏,菜单栏等来操纵跨浏览器窗口?

在 iPhone Safari HTML 页面上打开带有图像的 Youtube 视频

如何阻止 Safari 使用错误的电子邮件自动填充电子邮件字段?