如何在 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

难以访问在 Interface Builder .xib 文件中创建的 UITableViewCell

通过 monotouch 绑定在 Interface Builder 中创建为 UIView 的自定义控件