【问题标题】:How to get NSTableView to use a custom cell view mixed with preset cell views?如何让 NSTableView 使用与预设单元格视图混合的自定义单元格视图?
【发布时间】:2015-06-15 09:22:27
【问题描述】:

我在 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() 在这种情况下显然不是任何选择。

【问题讨论】:

    标签: macos swift cocoa nstableview nstableviewcell


    【解决方案1】:

    我会尝试在 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
    }
    

    【讨论】:

    • 是的,我想没有别的办法了。最快的方法是为每个列和单元格提供相同的 ID,例如0、1、2、3...等,然后创建指定列标识符的单元格。
    【解决方案2】:

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

    - (NSView *)tableView:(NSTableView *)tableView
       viewForTableColumn:(NSTableColumn *)tableColumn
                      row:(NSInteger)row {
    
        NSTableCellView *cell = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:NULL];
    
    
        return cell;
    }
    

    从这个起点,您可以轻松地对特定的列标识符采取行动,并根据您的逻辑制作另一个单元格视图。

    【讨论】: