NSTextfield完成

时间:2012-09-10 14:33:41

标签: cocoa autocomplete nstextfield

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

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

有几个单词而不是一个单词?因为当你输入一个空格时,再次开始完成......

感谢。

1 个答案:

答案 0 :(得分:4)

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

这是一个有点棘手的问题,因为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:方法,并使用自定义文本视图作为字段编辑器。因此,在修改文本字段的值时,任何完成操作都会在文本视图中调用-(NSRange)rangeForUserCompletion

然后,您可以对-rangeForUserCompletion进行微调,使其返回完成所需的确切范围。

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

希望有所帮助:)