8

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

我试过使用NSTextView's 的自动完成功能,但发现它不够用:

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

示例自动完成

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

这些是我想要实现的:

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

注意:这不是关于在文本字段后面添加进度指示器的问题。

4

2 回答 2

3

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

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

于 2013-09-30T03:45:51.450 回答
3

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

开发者会议解释了Cocoa 应用程序中必须完成的关键事件处理

自定义菜单

如果您希望能够选择多个单词,您需要提供自己的 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];
    }
}
于 2018-11-11T16:48:32.000 回答