Macos 在Swift中设置NSTableCellView的背景色
在搜索了SO和网络后,我正在努力找出一个我认为相对简单的概念。本质上,我在OSXSwift应用程序中有一个表,有几个列,它当前正在填充数据。我试图辨别如何设置每一行的背景色(最好是交替颜色,但我将从一种颜色开始)。我的MasterViewController文件是这样的Macos 在Swift中设置NSTableCellView的背景色,macos,swift,nstableview,Macos,Swift,Nstableview,在搜索了SO和网络后,我正在努力找出一个我认为相对简单的概念。本质上,我在OSXSwift应用程序中有一个表,有几个列,它当前正在填充数据。我试图辨别如何设置每一行的背景色(最好是交替颜色,但我将从一种颜色开始)。我的MasterViewController文件是这样的 import Cocoa class MasterViewController: NSViewController { var minions = [Minion]() func setupSampleMinion() {
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中的表视图的属性检查器中有一个简单的复选框来启用该选项 要使用非标准背景色,您需要设置行视图的
backgroundColor
,但不要设置在drawRect()的内部。如果更改影响视图在drawRect()
内部绘制方式的视图属性,则可能会将该视图标记为需要显示,这将引发对drawRect()
的另一次调用,等等
只需在代理的tableView(uquo:didAddRowView:forRow:)
方法中设置它就可以了。这在backgroundColor
属性的描述中有记录
关于覆盖drawRect()
:设置行视图的backgroundColor
可能会影响超类的绘制方式。因此,在呼叫super之后设置它不太可能有帮助。它肯定不会影响后续的NSRectFill()
调用。该函数依赖于当前图形上下文的填充颜色集(隐式)。您可以通过调用someColor.set()
来改变这一点
无论如何,如果您可以设置backgroundColor
,那么就不需要重写drawRect()
。如果您想通过设置颜色来实现一些超出可能范围的背景绘图,那么您应该覆盖drawRect()
,而不是drawRect()
最后,在创建新视图之前,您的tableView(tableView:rowViewForRow:)
实现应该首先调用表视图的makeViewWithIdentifier(u:owner:)
方法。它应该在创建的任何新视图上设置标识符。这允许表视图维护视图的重用队列,以避免不断地破坏和重新创建视图。非常感谢,肯!在你回复之前,我就开始玩弄这个文件,或多或少得出了相同的结论。安排视图控制器文件调用makeViewWithIdentifier(\uu:owner:)
方法首先解决了整个问题。我正在玩弄drawRect()
实现,但现在我明白了。非常感谢。