【问题标题】:NSTextView autocompletion delegate method not called from popup window未从弹出窗口调用 NSTextView 自动完成委托方法
【发布时间】:2014-12-16 15:00:19
【问题描述】:

我以编程方式调用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 的子类。

【问题讨论】:

  • 您的描述不完全清楚。你提到了NSTextView 的一个子类,但也提到了NSTextField。您是否使用自定义字段编辑器?该表是基于视图的表吗?在这种情况下,我猜你有一个实际的NSTextField,在这种情况下,重要的是文本字段的委托,而不是表格的委托。如果您使用的是基于NSCell 的表格视图,那么您将拥有NSTextFieldCells 而不是NSTextFields,并且表格的委托是相关的。
  • @KenThomases 抱歉,标题错误。我已经用关于表格实施的所有细节更新了这个问题。考虑到此代码到目前为止在主工作表中完美运行。但是对于我添加到弹出窗口的新表来说它失败了。但是调用了其他委托方法,这意味着委托已正确设置。

标签: objective-c macos cocoa


【解决方案1】:

如果有帮助,试试这个,为了执行自动完成,你需要使用下面的委托方法在文本字段编辑器中调用complete::-

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

【讨论】:

  • 问题是我需要触发完成:只要字段获得焦点,而不是当我输入内容时。这个方法调用太晚了。
  • 知道为什么这不适用于 NSTextField 吗?调用完成方法时抛出无法识别的选择器错误(该方法可用)。
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2011-12-03
  • 2020-03-24
  • 2013-07-14
  • 2020-10-22
相关资源
最近更新 更多