无法从弹出窗口调用NSTextView自动完成委托方法

时间:2014-12-16 15:00:20

标签: objective-c macos cocoa

我以编程方式调用complete:来调用NSTextView自动完成委托方法:

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

我有2个表,一个在主表中,另一个在弹出窗口中。弹出窗口从工作表中以模态方式打开。

两个表都具有与NSTextView相同的子类的列。 两个表都具有相同的文件所有者作为委托,但是仅为主表中的表调用委托方法。

奇怪的是,从弹出窗口中的表中正确调用了所有其他委托方法:

- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor
- (BOOL)control:(NSControl *)control isValidObject:(id)object
- (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

更新

关于NSTableView结构:

这些表格是基于单元格的NSTableView。该列由我NSTextFieldCell制作,我已经进行了子类化。以下代码来自子类NSTextFieldCell

该方法返回另一个子类,名为CBAutocompleteTextField,这次继承自NSTextView,它是单元格内的文本编辑器。

- (NSTextView *)fieldEditorForView:(NSView *)aControlView
{
    return [[[CBAutocompleteTextField alloc] init] autorelease];
} 

所以最后,调用complete:的类是NSTextView的子类。

1 个答案:

答案 0 :(得分:1)

尝试此操作如果有帮助,为了执行自动完成,您需要使用以下委托方法在文本字段字段编辑器中调用complete:: -

- (void)controlTextDidChange:(NSNotification *)notification {
    if( autoComplete ){
        return;
    } else {
        autoComplete = YES;
        [[[notification userInfo] objectForKey:@"NSFieldEditor"] complete:nil];
    }
}