4

我有一个基于视图的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
    } 
}

我有类似的代码适用于单元格- 即-tableView:viewForTableColumn:row:.

4

1 回答 1

4

好的,所以明显的(?)解决方案奏效了:

  1. 在 Interface Builder 上,将一个普通的香草拖放NSView到表中(它只接受特定列中的拖放,而不是作为表视图的直接子级)。

  2. 转到刚刚删除的视图的身份检查器,并将其类更改为“NSTableRowView”。

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

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


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

但它也被表格视图的设置(即交替行或不交替行)覆盖,所以我应该在这个方法中自定义它:

func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int)
{
    if (row % 4) == 0 {
        rowView.backgroundColor = NSColor.controlAlternatingRowBackgroundColors()[1]
    }
    else{
        rowView.backgroundColor = NSColor.clear()
    }    
}

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

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

于 2016-08-15T09:36:49.497 回答