在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 {
}
虽然我认为我有一些正确的编码,但似乎没有以任何方式设置行的背景颜色。任何想法或总体指导将非常感激。谢谢!
答案 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:)
方法。它应该在它创建的任何新视图上设置标识符。这允许表视图维护视图的重用队列,以避免不断破坏和重新创建视图。