我有一个 NSTableView ,其中每一行都有几列,这些列将具有不同的颜色,由 viewFor 方法确定。
当在基于视图的 NSTableView 中选择一行时,我想为选择栏中的背景和前景使用一组自定义颜色。
对于 isEmphasized = true 的行,背景为蓝色,前景文本为黄色。对于 isEmphasized = false 的行,背景为浅灰色,前景文本为黑色。
要更改选择栏颜色,我将 NSTableRowView 子类化
当我选择不同的行时,不再选择的前一行将保持前景文本颜色(所有列都是黄色或黑色),就像它被选中时一样。列不再用颜色编码。
当不再选择行时,如何恢复行上的颜色编码?
当 tableview 最初显示时,每个颜色编码的行都是调用 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
如何从 selectionIndexesForProposedSelection 调用 viewFor?
有关问题的演示,https://youtu.be/YESHvm8rP_M
class MyNSTableRowView: NSTableRowView {
override func drawSelection(in dirtyRect: NSRect) {
if self.selectionHighlightStyle != .none {
if self.isEmphasized {
NSColor.blue.setFill()
for columnIndex in 0..<self.numberOfColumns {
let cv = self.view(atColumn: columnIndex) as? NSTableCellView
cv?.textField?.textColor = NSColor.yellow
}
} else {
NSColor.lightGray.setFill()
for columnIndex in 0..<self.numberOfColumns {
let cv = self.view(atColumn: columnIndex) as? NSTableCellView
cv?.textField?.textColor = NSColor.black
}
}
dirtyRect.fill()
}
}
}
extension ScoreboardVC: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
return MyNSTableRowView()
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
//code...
}
func tableView(_ tableView: NSTableView,
selectionIndexesForProposedSelection proposedSelectionIndexes: IndexSet) -> IndexSet {
print("previously selected row", tableView.selectedRow)
if tableView.selectedRow >= 0 {
//How to call viewFor here?
}
for (index, row) in proposedSelectionIndexes.enumerated() {
print("proposed row=", row)
}
return proposedSelectionIndexes; // doesn't change the selection
}
}