我有一个基于视图的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:
。
答案 0 :(得分:3)
好的,所以显而易见的(?)解决方案有效:
在Interface Builder上,将普通香草NSView
拖放到表格中(它只接受特定列中的下拉,不作为直接子项表格视图)。
转到刚刚删除的视图的Identity Inspector,并将其Class更改为" NSTableRowView"。
因为只在我的代码中设置.backgroundColor属性不起作用,所以我改为使用this solution并添加了一个框视图作为子视图,并在Interface Builder中进行了配置。我必须在框和行视图之间设置自动布局约束,以便它在运行时延伸到行视图的实际大小。
(或者,我可以使用行视图的wantsLayer
属性...)
更新:事实证明我在代码中使用的backgroundColor
属性是在NSTableRowView
中定义的(NSView
没有这样的属性,不像{ {1}})。
但它也会被表格视图的设置覆盖(即,是否交替行),所以我应该用这种方法自定义它:
UIView
添加之后... (及其背景颜色由表格视图配置)。
(顺便说一下,事实证明我毕竟不需要自定义的行视图。至少不要自定义背景颜色)