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 ...