1

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

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

有几个词而不是一个词?因为当你输入一个空格时,补全又开始了……

谢谢。

4

1 回答 1

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:假设您的应用程序仅使用一个窗口,如果您使用多个窗口(例如基于文档的应用程序),您必须更改它并为每个窗口保留一个字段编辑器实例

希望能帮助到你 :)

于 2013-09-07T09:49:05.183 回答