Подтвердить что ты не робот

Каким образом ячейки выбраны программно в UICollectionView, когда разрешено разрешить многопользовательский выбор?

У меня разрешено использование MultipleSelection в виде коллекции. Клетки меняются на  выбранные состояния при нажатии. Все хорошо. Однако, когда я хочу reset весь вид выбранного состояния: НЕТ, используя приведенный ниже код, ячейки кажутся полностью отмененными, пока я не сделаю новый выбор, и в этот момент все ранее выбранные ячейки отображают свое ранее выбранное состояние.

то есть. несмотря на появление, коллекция не обновляет текущий список выбора, когда я программно отменяет выбор ячеек

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

В пользовательской ячейке:

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

Что я делаю неправильно? Есть ли другой способ отменить выбор всех ячеек?

Спасибо TBlue за то, что вы посмотрели

4b9b3361

Ответ 1

Вы можете выполнить итерацию по - [UICollectionView indexPathsForSelectedItems]:

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

Ответ 2

Можно сказать, что UITableViewCell.selected устанавливает только "видимое состояние/внешний вид" ячейки и ее содержимое. Вы можете отменить выбор ячеек, итерации по всем indexPaths tableView и вызова deselectRowAtIndexPath:animated: для каждого из них.

Например:

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

EDIT. Я полностью согласен с комментариями @BenLings и @JeremyWiebe, что решение @qorkfiend предпочтительнее этого.

Ответ 3

Самый простой способ отменить выбор всех выделенных ячеек в UICollectionView - это просто передать nil в качестве первого аргумента collectionView.selectItem(at:, animated:, scrollPosition:). Например.

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

очистит текущее состояние выбора, даже если allowsMultipleSelection == true.

Ответ 4

На всякий случай это простое решение в Swift:

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

Ответ 5

Для быстрого 3 расширения будет выглядеть так:

import UIKit

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

Ответ 6

Я создал глобальную переменную, называемую toggleCellSelection, затем запустил ее в функции 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
    }


}