cocoa - NSTextfield 完成

标签 cocoa autocomplete nstextfield

有一个解决方案可以使用以下方法完成 NSTextField :

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(int*)index 

有几个词而不是一个?因为当您输入空格时,补全会再次开始...

谢谢。

最佳答案

迟到总比不到好,这可能对其他人有帮助:

这是一个有点棘手的问题,因为 NSControlTextEditingDelegate/NSTextFieldDelegate没有提供直接解决问题的方法。您需要做的是创建 NSTextView 的自定义子类(是的,文本查看),并覆盖方法 - (NSRange)rangeForUserCompletion :

- (NSRange)rangeForUserCompletion
{
    return [self selectedRange];
}

然后子类NSTextFieldCell覆盖方法 - (NSTextView *)fieldEditorForView: :

- (NSTextView *)fieldEditorForView:(NSView *)aControlView
{
    static MyTextView* _myFieldEditor = nil;
    if (_myFieldEditor == nil) {
        _myFieldEditor = [[MyTextView alloc] init];
        [_myFieldEditor setFieldEditor:YES];
    }
    return _myFieldEditor;
}

然后在 Interface Builder 中,将文本字段单元格的类设置为 NSTextFieldCell 的子类。 。当您的文本字段成为第一响应者时,会发生什么,窗口将调用您的单元格的 -fieldEditorForView:方法,并使用自定义 TextView 作为字段编辑器。因此,在编辑文本字段的值期间,任何完成都会调用 -(NSRange)rangeForUserCompletion在您的 TextView 上。

然后你可以微调你的-rangeForUserCompletion使其返回您想要完成的精确范围。

此外,fieldEditorForView:中的代码假设您的应用仅使用一个窗口,如果您使用多个窗口(例如基于文档的应用),则必须对其进行更改并保留每个窗口一个字段编辑器实例强>.

希望有帮助:)

关于cocoa - NSTextfield 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353880/

相关文章:

cocoa - 直接将html代码传递到WebKit中

javascript - jQuery UI 自动完成 : Clear Previous Search Term

objective-c - NSTextField - *textField 内的操作

objective-c - 如何在 Mac OS X 上的 NSTextField 中启用拼写检查?

objective-c - 如何禁止 NSTextField 中的复制或粘贴操作?

objective-c - Objective-C中的合成属性是否自动触发didChangeObjectForKey :?

Cocoa:截取桌面壁纸(没有图标和窗口)

swift - NSTextView.typingAttributes 接受的键是什么?

javascript - Google places API 不显示自动完成下拉列表

javascript - Reactjs - 通过在自动完成组件( Material UI)中的每个输入更改上点击 API 来更新选项