0

我有一个 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
   }

}
4

0 回答 0