Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Swift中设置NSTableCellView的背景色_Macos_Swift_Nstableview - Fatal编程技术网

Macos 在Swift中设置NSTableCellView的背景色

Macos 在Swift中设置NSTableCellView的背景色,macos,swift,nstableview,Macos,Swift,Nstableview,在搜索了SO和网络后,我正在努力找出一个我认为相对简单的概念。本质上,我在OSXSwift应用程序中有一个表,有几个列,它当前正在填充数据。我试图辨别如何设置每一行的背景色(最好是交替颜色,但我将从一种颜色开始)。我的MasterViewController文件是这样的 import Cocoa class MasterViewController: NSViewController { var minions = [Minion]() func setupSampleMinion() {

在搜索了SO和网络后,我正在努力找出一个我认为相对简单的概念。本质上,我在OSXSwift应用程序中有一个表,有几个列,它当前正在填充数据。我试图辨别如何设置每一行的背景色(最好是交替颜色,但我将从一种颜色开始)。我的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中的表视图的属性检查器中有一个简单的复选框来启用该选项

要使用非标准背景色,您需要设置行视图的
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()
实现,但现在我明白了。非常感谢。