ios swift tableview checkmark

ios - Las marcas de verificación UITableView desaparecen al desplazarse



swift checkmark (5)

Cree una matriz de tuplas para almacenar valores de fila y sección:

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

En su cellForRowAtIndexPath , verifique si ha selectedCellValues cualquier valor de cellForRowAtIndexPath . Si es así, agregue un tipo de accessoryType para esa celda y salga del bucle,

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 }

Manejar 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) }

Tengo que hacer marcas de verificación en una tabla Vista, pero si me desplazo y una casilla marcada como marca de verificación no está visible y me desplazo hacia atrás, 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, falso, falso]


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


Un NSMutableIndexSet es un mejor objeto 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{ var cell : UITableViewCell = ......... if(boolArray[indexPath.row){ cell.accessoryType = UITableViewCellAccessoryType.Checkmark } else { cell.accessoryType = UITableViewCellAccessoryType.None } }

Prueba este código.


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 de accesorios después de var view = UITableViewCell ...