我在Cocoa编程第4版。第9章挑战。 我无法获取editColumn:row:withEvent:select to kick。调用其他tableView实例方法。 此方法位于tableViewController中,而不是myDocumentController。 如果此方法位于myDocumentController中,则它将起作用。我不喜欢将它添加到myDocumentController中是使其工作所需的额外代码。
方法editColumn:row:withEvent:select得到处理,因为表视图滚动到该行。该方法的其余部分不起作用。
文档说:../这个方法试图在第一个响应者的指定列和行上创建视图,如果视图支持编辑,它将开始编辑./..
首先,如何制作NSTableCellView
第一响应者?
那么如何确保NSTableCellView
可编辑?
我所看到的是对[[tableView window] setInitialFirstResponder:[tableView self]]; and [[tableView window] makeFirstResponder:[tableView self]];
的引用。这些不会使细胞的对象成为第一响应者。
BOOL editingEnded = [[tableView window] makeFirstResponder:[tableView self]];
if (editingEnded)
{
NSLog(@"End current edits sucessfull.");
}
else if(!editingEnded) {
NSLog(@"Unable to end editing.");
return;
}
// Select a row. There is no logic here yet.
NSUInteger row = 10;
[tableView editColumn:0
row:row // Row is scrolled into view but stays disabled.
withEvent:nil
select:YES];
答案 0 :(得分:1)
您在表格单元格视图中使用了哪种视图?对于基于视图的表,-editColumn:row:withEvent:select:
尝试将单元视图设置为第一响应者。如果单元格视图不接受第一响应者,那么它将无法工作。
如果对于视图类型有意义,您可以让单元格视图接受第一响应者。
或者,您可以选择该行,然后使用-[NSWindow makeFirstResponder:]
将其中一个单元格视图的子视图作为第一个响应者。对于文本字段或文本视图,这将有效地启动编辑。如果单元格视图是NSTableCellView
,那么您可能希望将其textField
作为第一个响应者。您将使用-[NSTableView viewAtColumn:row:makeIfNecessary:]
获取单元格视图。
更新
在下面的评论中,您将单元格视图描述为“图像和文本表格单元格视图”,我将其视为IB中该名称的一组视图:NSTableCellView
{{1} }和NSTextField
子视图连接到其出口。由于您的单元格视图(NSImageView
)本身不可编辑,因此您无法使用NSTableCellView
。相反,您必须将其中一个子视图(在本例中为文本字段)作为第一个响应者。你必须明确地这样做。所以,你需要使用我在7月31日的评论中提出的代码:
--editColumn:row:withEvent:select:
即,您获取单元格视图;从中你获得文本字段;然后你要求窗口将该文本字段作为第一个响应者。
鉴于您还希望选择行,您需要单独执行此操作:
[window makeFirstResponder:[[tableView viewAtColumn:0 row:row makeIfNecessary:NO] textField]];
如果窗口本身不是关键窗口,那么你需要把它作为关键窗口:
[tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];