Las marcas de verificación UITableView desaparecen al desplazarse

Tengo que hacer marcas en una vista de tabla, pero si estoy desplazándome y una celda con marca de verificación no es visible y retrocedo, la marca de verificación desapareció.

Mientras ejecuta este código

var boolArray = [Bool]() func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { var cell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! if cell.accessoryType == UITableViewCellAccessoryType.Checkmark { cell.accessoryType = UITableViewCellAccessoryType.None boolArray[indexPath.row] = false } else { cell.accessoryType = UITableViewCellAccessoryType.Checkmark boolArray[indexPath.row] = true } println(boolArray) } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { boolArray.append(false) var view = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CellTable") return view } 

Después de un poco de desplazamiento y marca de verificación, la matriz impresa es tan grande …

[verdadero, falso, verdadero, verdadero, verdadero, falso, falso, falso, falso, falso, falso, falso, falso, falso, falso, falso, falso, falso, falso, falso, falso]

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ var cell : UITableViewCell = ......... if(boolArray[indexPath.row){ cell.accessoryType = UITableViewCellAccessoryType.Checkmark } else { cell.accessoryType = UITableViewCellAccessoryType.None } } 

    Prueba este código

    Cree una matriz de tuplas para almacenar valores de filas y secciones:

     var selectedCells:[(row: Int, section: Int)] = [] 

    En su cellForRowAtIndexPath , verifique si tiene cellForRowAtIndexPath selectedCellValues . Si es así, agregue un tipo de accessoryType para esa celda y salga del ciclo,

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell = tableView.dequeueReusableCellWithIdentifier("SettingsCell", forIndexPath: indexPath) as SettingsCustomCell var rowNums:NSNumber = indexPath.row var sectionNums:NSNumber = indexPath.section var selectedRow:Int var selectedSection:Int if(selectedCells.count > 0){ for tuple in selectedCells{ selectedRow = tuple.row selectedSection = tuple.section if(selectedRow == rowNums && selectedSection == sectionNums){ cell.accessoryType = UITableViewCellAccessoryType.Checkmark break }else{ cell.accessoryType = UITableViewCellAccessoryType.None } } }else{ cell.accessoryType = UITableViewCellAccessoryType.None } var keyValue = listOfSectionTitles[indexPath.section] var items: [NSString] = dictionaryOfCellTitles.objectForKey(keyValue) as [NSString] cell.textLabel?.text = items[indexPath.row] return cell } 

    Maneje selectedcellvalues didSelecteRowAtIndexPath de didSelecteRowAtIndexPath selectedcellvalues en didSelecteRowAtIndexPath :

     func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let cell = tableView.cellForRowAtIndexPath(indexPath) if(cell?.accessoryType == UITableViewCellAccessoryType.None){ cell?.accessoryType = UITableViewCellAccessoryType.Checkmark selectedCells.append(row:indexPath.row, section:indexPath.section) }else{ var rowToDelete = indexPath.row var sectionToDelete = indexPath.section for var i=0; i < selectedCells.count; i++ { if(rowToDelete == selectedCells[i].row && sectionToDelete == selectedCells[i].section){ selectedCells.removeAtIndex(i) cell?.accessoryType = UITableViewCellAccessoryType.None } } } tableView.deselectRowAtIndexPath(indexPath, animated: true) } 

    Un NSMutableIndexSet es un mejor objeto para usar para rastrear el estado de la selección.

    También debe verificar el estado de selección cuando devuelve la celda para un indexPath

     var selectedCells = NSMutableIndexSet() func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) { var accessory=UITableViewCellAccessoryType.none if (selectedCells.containsIndex(indexPath.row) { selectedCells.removeIndex(indexPath.row) } else { selectedCells.addIndex(indexPath.row) accessory=.checkmark } if let cell = tableView.cellForRowAtIndexPath(indexPath) { cell.accessoryType = accessory } } func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell { var cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier:"CellTable") var accessory=UITableViewCellAccessoryType.none if (selectedCells.containsIndex(indexPath.row) { accessory = .checkmark } view.accessoryType=accessory return view } 
      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    reutiliza las celdas como puede ver en el código. var view = UITableViewCell ... mantener el estado de las celdas seleccionadas y asignar el estado de las vistas accesorias después de var view = UITableViewCell ...

    Su error está en cellForRowAtIndexPath cuando realiza boolArray.append(false) . cellForrRowAtIndexPath: se cellForrRowAtIndexPath: cada vez que se dibuja una celda, incluso si se ha dibujado antes . Una posible solución solo se indexPath.row falso si indexPath.row es mayor que la longitud de boolArray , de lo contrario es su ‘modelo’ y simplemente lo comprueba.