ios uitableview swift selection selected

ios - UITableViewCell Color de fondo seleccionado en selección múltiple



swift selection (10)

// Doesn''t work cell.selectionStyle = .Blue //Works when the selection is not multiple, if it''s multiple with each selection the previous one disappear... let cellBGView = UIView() cellBGView.backgroundColor = UIColor(red: 0, green: 0, blue: 200, alpha: 0.4) cell.selectedBackgroundView = cellBGView

¿Alguna respuesta sobre cómo establecer el color de fondo de las celdas que se seleccionan?


Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath)! selectedCell.contentView.backgroundColor = UIColor.darkGray } func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath)! selectedCell.contentView.backgroundColor = UIColor.clear }


Al agregar una vista personalizada con el color de fondo propio, puede tener un estilo de selección personalizado en la vista de tabla.

let customBGColorView = UIView() customBGColorView.backgroundColor = UIColor(hexString: "#FFF900") cellObj.selectedBackgroundView = customBGColorView

Agregue este código de 3 líneas en el método cellForRowAt de TableView. He usado una extensión en UIColor para agregar color con hexcode. Coloque este código de extensión al final de cualquier clase (fuera del cuerpo de la clase).

extension UIColor { convenience init(hexString: String) { let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) var int = UInt32() Scanner(string: hex).scanHexInt32(&int) let a, r, g, b: UInt32 switch hex.characters.count { case 3: // RGB (12-bit) (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) case 8: // ARGB (32-bit) (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) default: (a, r, g, b) = (255, 0, 0, 0) } self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) } }


El problema con el enfoque de Kersnowski es que cuando la celda se vuelve a dibujar, los cambios realizados cuando se selecciona / deselecciona desaparecen. Así que movería los cambios a la celda misma, lo que significa que aquí se requieren subclases. Por ejemplo:

class ICComplaintCategoryCell: UITableViewCell { @IBOutlet var label_title: UILabel! @IBOutlet var label_checkmark: UILabel! override func layoutSubviews() { super.layoutSubviews() reload() } func reload() { if isSelected { contentView.backgroundColor = UIColor.red } else if isHighlighted{ contentView.backgroundColor = UIColor.red } else { contentView.backgroundColor = UIColor.white } } }

Y en su vista de tabla, delegue simplemente reload llamada:

if let cell = self.table.cellForRowAtIndexPath(path) as? ICComplaintCategoryCell { cell.reload() }

Actualizado para Swift 3+, gracias @Bogy


Esto funcionó para mí:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { var selectedCell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! selectedCell.contentView.backgroundColor = UIColor.redColor() } // if tableView is set in attribute inspector with selection to multiple Selection it should work. // Just set it back in deselect override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { var cellToDeSelect:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! cellToDeSelect.contentView.backgroundColor = colorForCellUnselected } //colorForCellUnselected is just a var in my class


Para Swift 4, puedes hacer esto de dos maneras

1) clase: UITableViewCell

override func awakeFromNib() { super.awakeFromNib() //Costumize cell selectionStyle = .none }

o

2) tableView cellForRowAt

cell.selectionStyle = .none


SWIFT 3/4

Solución para CustomCell.selectionStyle = .none Si establece algún otro estilo, CustomCell.selectionStyle = .none color de fondo "mixto" con gris o azul.

¡Y no lo olvides! func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) no CustomCell.selectionStyle = .none cuando CustomCell.selectionStyle = .none .

extension MenuView: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cellType = menuItems[indexPath.row] let selectedCell = tableView.cellForRow(at: indexPath)! selectedCell.contentView.backgroundColor = cellType == .none ? .clear : AppDelegate.statusbar?.backgroundColor?.withAlphaComponent(0.15) menuItemDidTap?(menuItems[indexPath.row]) UIView.animate(withDuration: 0.15) { selectedCell.contentView.backgroundColor = .clear } } }


Swift 4

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedCell = tableView.cellForRow(at: indexPath)! as! LeftMenuCell selectedCell.contentView.backgroundColor = UIColor.blue }

Si desea deseleccionar la celda anterior, también puede usar la lógica diferente para esto

var tempcheck = 9999 var lastrow = IndexPath() var lastcolor = UIColor() func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if tempcheck == 9999 { tempcheck = 0 let selectedCell = tableView.cellForRow(at: indexPath)! as! HealthTipsCell lastcolor = selectedCell.contentView.backgroundColor! selectedCell.contentView.backgroundColor = UIColor.blue lastrow = indexPath } else { let selectedCelllasttime = tableView.cellForRow(at: lastrow)! as! HealthTipsCell selectedCelllasttime.contentView.backgroundColor = lastcolor let selectedCell = tableView.cellForRow(at: indexPath)! as! HealthTipsCell lastcolor = selectedCell.contentView.backgroundColor! selectedCell.contentView.backgroundColor = UIColor.blue lastrow = indexPath } }


También puede establecer el estilo de selectionStyle de .none en .none en el constructor de interfaz. La misma solución que @AhmedLotfy siempre, solo de IB.


Todas las respuestas anteriores están bien pero un poco complejas a mi gusto. La forma más sencilla de hacerlo es poner algún código en el cellForRowAtIndexPath . De esta forma, nunca tendrá que preocuparse por cambiar el color cuando la celda esté deseleccionada.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) /* this is where the magic happens, create a UIView and set its backgroundColor to what ever color you like then set the cell''s selectedBackgroundView to your created View */ let backgroundView = UIView() backgroundView.backgroundColor = YOUR_COLOR_HERE cell.selectedBackgroundView = backgroundView return cell }


Swift 3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier", for: indexPath) cell.selectionStyle = .none return cell }

Swift 2

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier", for: indexPath) cell.selectionStyle = .None return cell }