Las UICollectionViewCells previamente seleccionadas se deseleccionan después de que se toca la celda no seleccionable

Estoy implementando una UICollectionView con selección múltiple habilitada.

Algunas de mis celdas son seleccionables, otras no. Aquí está la cadena de events:

  1. Selecciono algunas celdas tocando en ellas y regresando YES a
    • shouldHighlightItemAtIndexPath:
    • shouldSelectItemAtIndexPath:
  2. Trato de seleccionar una celda no seleccionable tocando en ella (el aspecto no seleccionable se logra al devolver NO a shouldSelectItemAtIndexPath:
  3. Resultado: todas las celdas seleccionadas se deseleccionan y se didDeselectItemAtIndexPath: se didDeselectItemAtIndexPath: . NOTA: shouldDeselectItemAtIndexPath: no se llama.

Resultado esperado: no pasa nada

¿Es este comportamiento normal? No puedo encontrar nada en los documentos. Si es así, ¿cómo puedo hacer para no deseleccionar mis células?

Tuve que hacer frente exactamente al mismo problema, con collectionView:shouldDeselectItemAtIndexPath: no se llama. Mi solución consiste en volver a seleccionar manualmente la celda seleccionada actualmente si estoy tocando en una celda no seleccionable:

 - (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath { BOOL isSelectable = /* decide if currently tapped cell should be selectable */; NSIndexPath *selectedItemIndexPath = /* NSIndexPath of the current selected cell in the collection view, set in collectionView:didSelectItemAtIndexPath: */; if (!isSelectable) { // the cell isn't selectable, we have to reselect the previously selected cell that has lost selection in the meanwhile // without reloading first the cell the selection is not working... [collectionView reloadItemsAtIndexPaths:@[selectedItemIndexPath]]; [collectionView selectItemAtIndexPath:selectedItemIndexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone]; } return isSelectable; } 

Si la vista de colección está desplazándose (ocultando la celda actualmente seleccionada) recuerde volver a seleccionar la celda en collectionView:cellForItemAtIndexPath:

No me gusta demasiado esta solución, es demasiado "hacky", pero funciona. Esperaría hacer toda la lógica en la collectionView:shouldDeselectItemAtIndexPath: pero no se llama y no entiendo por qué.

 override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeue... cell.userInteractionEnabled = isSelectableIndexPath(indexPath) return cell } func isSelectableIndexPath(indexPath: NSIndexPath) -> Bool { //logic to check if cell is selectable } 

Esto funciona deshabilitando la interacción con la célula.