【发布时间】: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