Macos 如何使NSTableView使用自定义单元视图与预设单元视图混合?

Macos 如何使NSTableView使用自定义单元视图与预设单元视图混合?,macos,swift,cocoa,nstableview,nstableviewcell,Macos,Swift,Cocoa,Nstableview,Nstableviewcell,我在Interface Builder中配置了一个NSTableView,它使用了几个默认的单元格视图。但是,第一列的单元格视图需要从自定义类创建。如何实现NSTableViewDataSource方法tableView.viewForTableColumn(),以便为其余列创建默认单元格视图 到目前为止,我的方法如下: func tableView(tableView:NSTableView, viewForTableColumn tableColumn:NSTableColumn?, row

我在Interface Builder中配置了一个
NSTableView
,它使用了几个默认的单元格视图。但是,第一列的单元格视图需要从自定义类创建。如何实现
NSTableViewDataSource
方法
tableView.viewForTableColumn()
,以便为其余列创建默认单元格视图

到目前为止,我的方法如下:

func tableView(tableView:NSTableView, viewForTableColumn tableColumn:NSTableColumn?, row:Int) -> NSView?
{
    /* Create custom cell view for first column. */
    if (tableColumn?.identifier == "nameColumn")
    {
        let view = tableView.makeViewWithIdentifier("nameCellView", owner: nil) as! NameTableCellView;
        return view;
    }

    /* Return default cell views (defined in IB) for the rest. */
    return tableView.viewAtColumn(??, row: row, makeIfNecessary: true); // How to get column index??
}

如何为
tableView.viewAtColumn()
获取正确的列索引
tableView.columnForView()
tableView.columnWithIdentifier()
显然不是这种情况下的任何选项。

我会尝试在Interface Builder中为默认单元格指定您自己的标识符

…然后将其与
makeViewWithIdentifier:
结合使用:

func tableView(tableView: NSTableView,
    viewForTableColumn
    tableColumn: NSTableColumn?, row: Int) -> NSView? {

        var viewIdentifier = "StandardTableCellView"

        if let column = tableColumn {

            switch column.identifier {

            case "nameColumn":
                viewIdentifier = "nameCellView"

            default: break

            }
        }

        return tableView.makeViewWithIdentifier(viewIdentifier, owner: self) as? NSView
}

我找到了一个很好的解决方案:可以使表列标识符与相应的视图单元格标识符相同。之后,您可以在委托中使用:

- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {

    NSTableCellView *cell = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:NULL];


    return cell;
}

从这个起点出发,您可以轻松地对特定的列标识符执行操作,并根据您的逻辑生成另一个cellview。

是的,我想没有其他方法了。最快的方法是为每个列和单元格提供相同的ID,例如0、1、2、3。。。等,然后使用指定的列标识符创建单元格。