如何在Interface Builder

时间:2016-08-15 09:20:19

标签: cocoa interface-builder nstableview nstablerowview

我有一个基于视图的NSTableView,我试图自定义某些行的外观。

我知道我需要实现标题中提到的委托方法;但是,我不确定如何做到这一点。

文档说:

  

您可以使用委托方法tableView:rowViewForRow:来自定义   行视图。您通常使用Interface Builder进行设计和布局   表中的NSTableRowView原型行。与原型一样   单元格,原型行在运行时以编程方式检索。   NSTableRowView子类的实现完全是可选的。

然而,与单元格不同,界面构建器中没有NSTableRowView类,也不清楚如何设置"原型"行视图。

我正在尝试这样的事情(Swift 3):

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView?
{
    if (row % 4) == 0 {
        // .................................................. 
        // [ A ] SPECIAL ROW:

        if let rowView = tableView.make(withIdentifier: "SpecialRow", owner: self) as? NSTableRowView {

            rowView.backgroundColor = NSColor.gray()
            return rowView
        }
        else {
            return nil
        }

        // ^ Always returns nil (Because I don't know how
        // to setup the prototype in Interface Builder)
    }
    else{
        // ..................................................
        // [ B ] NORMAL ROW (No customization needed)

        return nil
    } 
}

我有类似的代码适用于单元格 -i.e。,-tableView:viewForTableColumn:row:

1 个答案:

答案 0 :(得分:3)

好的,所以显而易见的(?)解决方案有效:

  1. 在Interface Builder上,将普通香草NSView拖放到表格中(它只接受特定列中的下拉,作为直接子项表格视图)。

  2. 转到刚刚删除的视图的Identity Inspector,并将其Class更改为" NSTableRowView"。

  3. 因为只在我的代码中设置.backgroundColor属性不起作用,所以我改为使用this solution并添加了一个框视图作为子视图,并在Interface Builder中进行了配置。我必须在框和行视图之间设置自动布局约束,以便它在运行时延伸到行视图的实际大小。

  4. (或者,我可以使用行视图的wantsLayer属性...)

    更新:事实证明我在代码中使用的backgroundColor属性是在NSTableRowView中定义的(NSView没有这样的属性,不像{ {1}})。

    但它也会被表格视图的设置覆盖(即,是否交替行),所以我应该用这种方法自定义它:

    UIView
    添加之后

    ... (及其背景颜色由表格视图配置)。

    (顺便说一下,事实证明我毕竟不需要自定义的行视图。至少不要自定义背景颜色)