Ранее выбранные UICollectionViewCells не выбраны после того, как выбранная ячейка не выбрана

Я реализую UICollectionView с включенным множественным выбором.

Некоторые из моих ячеек выбираются, некоторые – нет. Вот цепочка событий:

  1. Я выбираю несколько ячеек, нажимая на них и возвращаю YES для
    • shouldHighlightItemAtIndexPath:
    • shouldSelectItemAtIndexPath:
  2. Я пытаюсь выбрать ячейку, не подлежащую выбору, нажав на нее ( shouldSelectItemAtIndexPath: аспект достигается путем возврата NO в shouldSelectItemAtIndexPath:
  3. Результат: все выбранные ячейки didDeselectItemAtIndexPath: и на них didDeselectItemAtIndexPath: ПРИМЕЧАНИЕ: shouldDeselectItemAtIndexPath: не вызывается.

Ожидаемый результат: ничего не происходит.

Это нормальное поведение? Я не могу найти ничего в документах. Если да, то как я могу отказаться от отмены моих ячеек?

Мне пришлось столкнуться с одной и той же проблемой: с помощью collectionView:shouldDeselectItemAtIndexPath: не collectionView:shouldDeselectItemAtIndexPath: . Мое решение состоит в том, чтобы вручную повторно выбрать выбранную ячейку, если я нажимаю на неизбираемую ячейку:

 - (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; } 

Если просмотр вашей коллекции прокручивается (скрытие текущей выделенной ячейки), не забудьте повторно выбрать ячейку в collectionView:cellForItemAtIndexPath:

Мне не очень нравится это решение, оно слишком «взломанно», но оно работает. Я ожидал бы сделать всю логику в collectionView:shouldDeselectItemAtIndexPath: но он не вызывается, и я не понимаю, почему.

 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 } 

Это работает, отключая взаимодействие с ячейкой.

Interesting Posts
Давайте будем гением компьютера.