当用户输入时,动态显示“{推荐列表”NSTextField
的最简单方法是什么?就像Safari的地址栏有一些菜单(我非常自信Safari的地址栏建议是菜单,因为它有圆角,蓝色渐变选择和背景模糊)。
我尝试使用NSTextView
's autocompletion facility,但发现它不合适:
在上面的示例屏幕截图中,每当我选择自动填充建议时,文本字段只会将K
替换为列表中的建议项目,从而生成Abadi Abadi Kurniawan
。
这些是我想要实现的目标:
注意:这是不关于adding progress indicator behind a text field的问题。
答案 0 :(得分:2)
这只能解决你答案的一半,但我相信你需要继承NSTextView
并实现- (NSRange)rangeForUserCompletion
方法,在文本字段中返回整个字符串的范围。这应该确保它不会自动完成最近输入的单词。
如果你想要一个自定义菜单,你可能需要自己做,可能是通过实施-controlTextDidChange:
方法并在适当的时候显示带有表格的自定义视图。
答案 1 :(得分: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];
}
}