如何-editColumn:row:withEvent:select:使用基于NSView的表视图使用核心数据

时间:2014-07-28 21:41:32

标签: objective-c macos cocoa core-data cocoa-bindings

我在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];

1 个答案:

答案 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];