uicollectionviewcontroller tutorial example collection iphone objective-c uicollectionview

iphone - tutorial - uicollectionviewcell indexpath



¿Cómo se deseleccionan las células mediante programación en UICollectionView cuando allowMultipleSelection está habilitado? (8)

He allowMultipleSelection habilitado en una vista de colección. Las celdas cambian hacia y desde sus estados seleccionados cuando se tocan. Todo bien. Sin embargo, cuando quiero restablecer toda la vista al estado seleccionado: NO usando el código siguiente, las celdas parecen estar completamente deseleccionadas hasta que haga una nueva selección, momento en el que todas las celdas previamente seleccionadas muestran su estado previamente seleccionado.

es decir, a pesar de las apariencias, la vista de colección no actualiza su lista de selección actual cuando desactivo las celdas mediante programación

- (void)clearCellSelections { for (LetterCell *cell in self.collectionView.visibleCells) { [cell prepareForReuse]; } }

En una celda personalizada:

- (void)prepareForReuse { [super prepareForReuse]; [self setSelected:NO]; }

¿Qué estoy haciendo mal? ¿Hay alguna otra forma de anular la selección de todas las celdas?

Gracias TBlue por echar un vistazo


Creé una variable global llamada toggleCellSelection, luego la ejecuté en la función didSelectItemAt:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { print("select cell /(indexPath.row)") let cell = collectionView.cellForItem(at: indexPath) if (toggleCellSelection == true) { toggleCellSelection = false cell?.layer.borderWidth = 0 cell?.layer.borderColor = UIColor.clear().cgColor } else { toggleCellSelection = true cell?.layer.borderWidth = 5 cell?.layer.borderColor = #colorLiteral(red: 0.8779790998, green: 0.3812967837, blue: 0.5770481825, alpha: 1).cgColor } }


En caso de que esta sea una solución simple en Swift:

extension UICollectionView { func deselectAllItems(animated animated: Bool = false) { for indexPath in self.indexPathsForSelectedItems() ?? [] { self.deselectItemAtIndexPath(indexPath, animated: animated) } } }


Esta es la respuesta de @qorkfiend en Swift

// this is an array of the selected item(s) indexPaths guard let indexPaths = collectionView.indexPathsForSelectedItems else { return } // loop through the array and individually deselect each item for indexPath in indexPaths{ collectionView.deselectItem(at: indexPath, animated: true) }


La forma más sencilla de deseleccionar todas las celdas seleccionadas en un UICollectionView es simplemente pasar nil como primer argumento a collectionView.selectItem(at:, animated:, scrollPosition:) . P.ej,

collectionView.selectItem(at: nil, animated: true, scrollPosition: [])

borrará el estado de selección actual, incluso cuando allowsMultipleSelection == true .


No es que esta respuesta sea necesariamente la "mejor", pero como nadie la mencionó, la agregaré.

Simplemente puede llamar a lo siguiente.

collectionView.allowsSelection = false collectionView.allowsSelection = true


Para swift 3 Extension se vería así:

import UIKit extension UICollectionView { func deselectAllItems(animated: Bool = false) { for indexPath in self.indexPathsForSelectedItems ?? [] { self.deselectItem(at: indexPath, animated: animated) } } }


Puede iterar sobre - [UICollectionView indexPathsForSelectedItems] :

for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) { [self.collectionView deselectItemAtIndexPath:indexPath animated:NO]; }


Se podría decir que UITableViewCell.selected solo establece el ''estado / apariencia visible'' de la celda y su contenido. Puede anular la selección de las celdas, iterando sobre todos los indexPaths de tableView y call deselectRowAtIndexPath:animated: para cada uno.

Por ejemplo:

for (int i=0; i < self.myData.count; i++) { [self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] animated:YES]; }

EDITAR : Estoy totalmente de acuerdo con los comentarios de @BenLings y @ JeremyWiebe, que se prefiere la solución de @qorkfiend a esta.