如何在 Interface Builder 中创建 NSTableRowView 原型
Posted
技术标签:
【中文标题】如何在 Interface Builder 中创建 NSTableRowView 原型【英文标题】:How to prototype NSTableRowView in Interface Builder 【发布时间】:2016-12-21 12:04:32 【问题描述】:我有一个基于视图的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
我有类似的代码适用于 cells -即-tableView:viewForTableColumn:row:
。
【问题讨论】:
【参考方案1】:好的,显而易见的 (?) 解决方案奏效了:
在 Interface Builder 上,将一个普通的 NSView
拖放到表中(它只接受特定列中的拖放,不作为表的直接子级查看)。
转到刚刚删除的视图的身份检查器,并将其类更改为“NSTableRowView”。
1234563我必须在框和行视图之间设置自动布局约束,以便它在运行时拉伸到行视图的实际大小。(或者,我可以使用行视图的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()
...在它被添加之后(以及它的背景颜色由表格视图配置)。
(顺便说一句,我毕竟不需要自定义行视图。至少不需要自定义背景颜色)
【讨论】:
以上是关于如何在 Interface Builder 中创建 NSTableRowView 原型的主要内容,如果未能解决你的问题,请参考以下文章
如何在具有自动布局的 Interface Builder 中创建的现有视图中添加视图?
无法关闭在 Interface Builder 中创建的 NSView 实例的剪辑
iOS 开发 - 如何使用自定义 Table View Controller 显示在 Interface Builder 中创建的静态单元格?
在 Interface Builder 中显示在代码中创建的 UIButton