在 Swift 中设置 NSTableCellView 的背景颜色

Setting Background Color of NSTableCellView in Swift

通过 SO 和在线搜索后,我正在努力找出一个我认为相对简单的概念。本质上,我在 OS X Swift 应用程序中有一个 table,有几个列,它当前正在填充数据。我试图辨别如何设置每个 "row" 的背景颜色(最好使用交替颜色,但我将从一种颜色开始)。我的 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 {
}

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

如果您只想让行对行使用标准的交替颜色,IB 中 table 视图的属性检查器中有一个简单的复选框来启用它。

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

只需在委托的 tableView(_:didAddRowView:forRow:) 方法中进行设置即可。 backgroundColor 属性.

的描述中对此进行了记录

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

来更改它

买吧,反正可以设置backgroundColor就不用覆盖drawRect()了。如果你想通过设置颜色来实现一些超出可能范围的背景绘制,你应该覆盖 drawBackgroundInRect() 而不是 drawRect(),无论如何。

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