mi vista de tabla reutiliza las celdas seleccionadas cuando se desplaza – en SWIFT

Buenos días

mi problema es que mi vista de tabla reutilice la celda seleccionada cuando me desploop hacia abajo y hacia arriba otra vez … me refiero cuando selecciono una celda de arriba y luego me desploop hacia abajo, algunas celdas que no seleccioné se muestran seleccionadas, también algunas celdas seleccionadas de arriba son no se mostró seleccionada cuando me desploop nuevamente, y cuando sucedió esto, soy manzana otra vez para seleccionar más que una sola celda que no debe estar permitida … quiero mencionar que intenté save la ruta del índice anterior desde 'didSelectRowAtIndexPath' y lo comprobé así en 'CellForRowAtIndexPath' pero no funciona:

if (old == indexpath) { cell?.backgroundColor = UIColor.networkingColor() cell?.textLabel?.backgroundColor = UIColor.whiteColor() //to change only the thumbnail color and keep the cell color } else { cell?.backgroundColor = UIColor.whiteColor() } 

Ahora aquí está mi código

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = myTable.dequeueReusableCellWithIdentifier("WorkCell") as UITableViewCell cell.tag = (indexPath.row) + 1 cell.textLabel?.text = Berufs[indexPath.row] var img = UIImageView(frame: CGRect(x: 10, y: 3, width: 40 , height: 40)) cell.selectionStyle = UITableViewCellSelectionStyle.None img.image = UIImage(named: "transparent.png") cell.indentationLevel = 1 cell.indentationWidth = 45 cell.addSubview(img) return cell } var old = 1000 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let indexPath = tableView.indexPathForSelectedRow() let cell = tableView.cellForRowAtIndexPath(indexPath!) var tmpCell = view.viewWithTag(old) var rowNum = (cell?.tag)! - 1 if (cell?.backgroundColor == UIColor.networkingColor()) { cell?.backgroundColor = UIColor.whiteColor() } else if (cell?.backgroundColor != UIColor.networkingColor()) { tmpCell?.backgroundColor = UIColor.whiteColor() cell?.backgroundColor = UIColor.networkingColor() cell?.textLabel?.backgroundColor = UIColor.whiteColor() println("du interssiert dich für \(Berufs[rowNum])") } old = rowNum + 1 } 

Actualmente almacena el estado de selección en backgroundColor. Esa no es una buena idea porque, por motivos de performance, las tablas serán reutilizadas por tableView.

Debería save los path index seleccionados en el model de datos. Si desea permitir la selección múltiple, puede almacenar los índices indexados seleccionados en un NSMutableSet.

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell cell.selectionStyle = .None configure(cell, forRowAtIndexPath: indexPath) return cell } var selectedIndexPaths = NSMutableSet() func configure(cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.textLabel!.text = "Row \(indexPath.row)" if selectedIndexPaths.containsObject(indexPath) { // selected cell.backgroundColor = UIColor.networkingColor() } else { // not selected cell.backgroundColor = UIColor.whiteColor() } } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { if selectedIndexPaths.containsObject(indexPath) { // deselect selectedIndexPaths.removeObject(indexPath) } else { // select selectedIndexPaths.addObject(indexPath) } let cell = tableView.cellForRowAtIndexPath(indexPath)! configure(cell, forRowAtIndexPath: indexPath) } 

Si solo necesita una selección única, debe save el índice de ruta seleccionado en un NSIndexPath. Instancia variable

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell cell.selectionStyle = .None configure(cell, forRowAtIndexPath: indexPath) return cell } var selectedIndexPath: NSIndexPath? func configure(cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.textLabel!.text = "Row \(indexPath.row)" if selectedIndexPath == indexPath { // selected cell.backgroundColor = UIColor.networkingColor() } else { // not selected cell.backgroundColor = UIColor.whiteColor() } } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { if selectedIndexPath == indexPath { // selected same cell -> deselect all selectedIndexPath = nil } else { // select different cell let oldSelectedIndexPath = selectedIndexPath selectedIndexPath = indexPath // refresh old cell to clear old selection indicators var previousSelectedCell: UITableViewCell? if let previousSelectedIndexPath = oldSelectedIndexPath { if let previousSelectedCell = tableView.cellForRowAtIndexPath(previousSelectedIndexPath) { configure(previousSelectedCell, forRowAtIndexPath: previousSelectedIndexPath) } } } let selectedCell = tableView.cellForRowAtIndexPath(indexPath)! configure(selectedCell, forRowAtIndexPath: indexPath) } 

Tuve el mismo problema hace un time, lo que hice es que agregué una nueva variable (Bool) llamada isset a CustomTableViewCell, y cuando creé la célula por primera vez, la cambié a verdadera, así que después de querer reutilizar una celda ya configurada, acabo de devolver el set arleady uno, para no establecerlo de nuevo:

 let cell = tableView.dequeueReusableCellWithIdentifier("Cellidentifier", forIndexPath: indexPath) as CustomTableViewCell if cell.isset { return cell } //set your cell here cell.isset = true return cell