在Swift中设置NSTableCellView的背景颜色

时间:2015-07-22 17:13:46

标签: macos swift nstableview

在SO和网上搜索之后,我努力想出一个我认为相对简单的概念。基本上,我在OS X Swift应用程序中有一个表,有几列,它目前正在填充数据。我试图辨别出如何设置每个"行"的背景​​颜色。 (理想情况下,颜色交替,但我只用一种颜色开始)。我的MasterViewController文件是这样的;

import Cocoa

class MasterViewController: NSViewController {

var minions = [Minion]()

func setupSampleMinion() {
    minions = Minion.fetchMinionData()
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.
}

}

// MARK: - NSTableViewDataSource extension MasterViewController: NSTableViewDataSource {
func numberOfRowsInTableView(aTableView: NSTableView) -> Int {
    return self.minions.count
}

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {

    // 1
    var cellView: NSTableCellView = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: self) as! NSTableCellView

    let minion = self.minions[row]

    // 2
    if tableColumn!.identifier == "MyColumn" {
        // 3

        cellView.imageView!.image = NSImage(named: "minion.name!")
        cellView.textField!.stringValue = minion.name!
        return cellView
    }

    return cellView
}
}

func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
let myCustomView = MyRowView()
return myCustomView
}

class MyRowView: NSTableRowView {

override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)

    self.backgroundColor = NSColor(red: 0.76, green: 0.82, blue: 0.92, alpha: 1)

    NSRectFill(dirtyRect)


}
}

// MARK: - NSTableViewDelegate extension MasterViewController: NSTableViewDelegate {
}

虽然我认为我有一些正确的编码,但似乎没有以任何方式设置行的背景颜色。任何想法或总体指导将非常感激。谢谢!

1 个答案:

答案 0 :(得分:2)

如果您只是希望行使用行的标准交替颜色,那么在IB的表视图的“属性”检查器中有一个简单的复选框以启用它。

要使用非标准背景颜色,您需要设置行视图backgroundColor,但不要设置drawRect()内部。如果您更改影响drawRect()内部绘制方式的视图属性,则可能会将该视图标记为需要显示,这会引发对drawRect()等的另一次调用。

只需在委托的tableView(_:didAddRowView:forRow:)方法中设置它即可。这已在backgroundColor属性的描述中记录。

关于您覆盖drawRect()的尝试:设置行视图' s backgroundColor可能会影响超类的绘制方式。因此,在调用super之后将其设置为不太可能有所帮助。 肯定不会影响后续的NSRectFill()电话。该函数依赖于当前图形上下文的填充颜色集,这是隐式的。您可以通过调用someColor.set()来更改它。

购买,无论如何,应该无需覆盖drawRect(),因为您可以设置backgroundColor。如果您想通过设置颜色来实现超出可能范围的背景绘制,则无论如何都应该覆盖drawBackgroundInRect()而不是drawRect()

最后,在创建新视图之前,您的tableView(tableView:rowViewForRow:)实现应首先调用表格视图的makeViewWithIdentifier(_:owner:)方法。它应该在它创建的任何新视图上设置标识符。这允许表视图维护视图的重用队列,以避免不断破坏和重新创建视图。