在 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 视图维护视图的重用队列,以避免不断销毁和重新创建视图。
通过 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 视图维护视图的重用队列,以避免不断销毁和重新创建视图。