uitableviewcontroller uitableviewcell example efecto cellforrowat apple swift macos cocoa colors tableview

swift - uitableviewcell - selección de contenido de la imagen de tableview



uitableview swift 4 example (2)

Crea una celda personalizada y anula el conjunto setHighlighted(_ highlighted: Bool, animated: Bool) para cambiar el tintColor del iamgeView:

override func setHighlighted(_ highlighted: Bool, animated: Bool) { super.setHighlighted(highlighted, animated: animated) imageView?.tintColor = highlighted ? UIColor.white : UIColor.green }

Luego, cuando creas tu celda, configuras la imagen con un UIImageRenderingMode.alwaysTemplate :

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = CustomCell() cell.imageView?.image = UIImage(named: "custom_image")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate) cell.imageView?.tintColor = UIColor.green return cell }

Mi aplicación tiene una vista de tabla con una imagen y un campo de texto:

  • imagen = imagen renderizada como imagen de plantilla (gris claro)
  • campo de texto = color de texto negro

Si selecciono una fila, el color de ambos cambiará perfectamente a blanco

Pregunta: cambio la imagen a una imagen en color azul = renderizar como predeterminado. Si ahora selecciono una fila, el color del texto de mi campo de texto cambiará a blanco, pero la imagen permanecerá azul.

Quiero que la imagen cambie el color a blanco también, pero no lo hace.

¿Qué hice mal?

Ejemplo con una imagen renderizada como modo de plantilla => predeterminado: gris | seleccionado automáticamente blanco

Ejemplo con una imagen en color renderizada como modo predeterminado => predeterminado: verde | seleccionado también verde | Blanco esperado, pero se mantiene verde.


Prueba esto:

import Cocoa class ViewController: NSViewController { @IBOutlet weak var tableView:NSTableView! var selectIndex = -1 override func viewDidLoad() { super.viewDidLoad() self.tableView.delegate = self self.tableView.dataSource = self } func tintedImage(_ image: NSImage, tint: NSColor) -> NSImage { guard let tinted = image.copy() as? NSImage else { return image } tinted.lockFocus() tint.set() let imageRect = NSRect(origin: NSZeroPoint, size: image.size) NSRectFillUsingOperation(imageRect, .sourceAtop) tinted.unlockFocus() return tinted } } extension ViewController:NSTableViewDataSource, NSTableViewDelegate{ func numberOfRows(in tableView: NSTableView) -> Int { return 3 } func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?{ let result = tableView.make(withIdentifier: "imageIcon", owner: self) as! NSTableCellView if selectIndex == row{ result.imageView?.image = self.tintedImage(NSImage(named:"file")!, tint: NSColor.green) }else{ result.imageView?.image = self.tintedImage(NSImage(named:"file")!, tint: NSColor.gray) } return result } func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int) { if selectIndex == row{ rowView.backgroundColor = NSColor.blue }else{ rowView.backgroundColor = NSColor.clear } } func tableViewSelectionDidChange(_ notification: Notification) { let table = notification.object as! NSTableView self.selectIndex = tableView.selectedRow print(table.selectedRow); table.reloadData() } }

Nota: Cambie el color de viewView tintColor según su requisito.


Espero que te ayude.