NSTableView可编辑标题并双击表格Cell

时间:2013-07-18 07:05:16

标签: macos cocoa nstableview

使用this Stackoverflow question中的可编辑标头实现了NSTableView。除了在表格中双击以编辑单元格外,一切正常。这不再有效。

我怀疑这是因为NSTableView setDoubleAction:位设置为自定义方法,然后该方法成为表中所有双击事件的处理程序(原始问题的代码示例如下):

-(void)setupTableHeader:(id)table {
    NSArray *columns = [table tableColumns];
    NSEnumerator *cols = [columns objectEnumerator];
    NSTableColumn *col = nil;

    NBETableHeaderCell *iHeaderCell;

    while (col = [cols nextObject]) {
        iHeaderCell = [[NBETableHeaderCell alloc] initTextCell:[[col headerCell] stringValue]];
        [col setHeaderCell:iHeaderCell];
        [[col headerCell] setEditable:YES];
        [iHeaderCell release];
    }
    [table setTarget:self];
    [table setDoubleAction:@selector(doubleClickInTableView:)]; // < This bit
}

我的问题是,如何恢复用于编辑表格单元格的双击功能?

谢谢。

1 个答案:

答案 0 :(得分:1)

在准备问题后不久找到了答案,并认为它可能是Q&amp; A。

doubleClickInTableView:方法中,检查以确保单击标题单元格。因此,使用else子句扩展该检查就足够了,并在那里实现editColumn:row:withEvent:select:

-(void)doubleClickInTableView:(id)sender
{
    NSInteger row = [sender clickedRow];
    NSInteger column = [sender clickedColumn];

    if(row == -1&& column >= 0)
    {
        NSTableColumn *tableColumn = [[sender tableColumns] objectAtIndex:column];
        NSTableHeaderView *headerView = [sender headerView];
        YCTableHeaderCell *headerCell = [tableColumn headerCell];

        NSWindow *window = [[NSApplication sharedApplication] mainWindow];
        id cellEditor = [window fieldEditor:YES forObject:sender];

        [headerCell setHighlighted:YES];
        [headerCell selectWithFrame:[headerView headerRectOfColumn:column]
                             inView:headerView
                             editor:cellEditor
                           delegate:headerCell
                              start:0
                             length:headerCell.stringValue.length];

        [cellEditor setBackgroundColor:[NSColor whiteColor]];
        [cellEditor setDrawsBackground:YES];
    }
    // This bit below.
    else if(row >= 0 && column >= 0)
    {
        [sender editColumn:column row:row withEvent:nil select:true];
    }
}