gpt4 book ai didi

macos - NSTextField 具有像 Safari 地址栏一样的自动建议功能吗?

转载 作者:行者123 更新时间:2023-12-03 16:09:20 26 4
gpt4 key购买 nike

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

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

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

Sample autocomplete

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

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

  • 每当选择建议时,整个文本字段都会被该建议替换。
  • 使建议列表与文本字段的左侧对齐。

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

最佳答案

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

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

CustomMenu

如果您希望能够选择多个单词,您需要提供自己的 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];
}
}

关于macos - NSTextField 具有像 Safari 地址栏一样的自动建议功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18674992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com