UICollectionПосмотрите, как отменить выбор всего

У меня есть программа FollowVC и FollowCell с коллекционным представлением. Я могу правильно отобразить все данные в ячейке представления uIcollection, используя следующий код без проблем.

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("FollowCell", forIndexPath: indexPath) as? FollowCell {

        let post = posts[indexPath.row]

        cell.configureCell(post, img: img)

        if cell.selected == true {
            cell.checkImg.hidden = false
        } else {
            cell.checkImg.hidden = true
        }
        return cell
    }
}

Обратите внимание, что я также могу выбрать и отменить выбор нескольких изображений, используя следующий код

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    if deletePressed == true {
        let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FollowCell
        cell.checkImg.hidden = false
    } else {
        let post = posts[indexPath.row]
        performSegueWithIdentifier(SEGUE_FOLLOW_TO_COMMENTVC, sender: post)
    }
}

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FollowCell
    cell.checkImg.hidden = true
}

Когда в режиме "Выбрать" я могу выполнить выделение каждой ячейки, и галочка будет отображаться в ячейке. Однако то, что я хочу сделать, - это отменить buttom, чтобы отключить всю выбранную ячейку и удалить checkImg.

Я пробовал

    func clearSelection() {
    print("ClearSelection posts.count = \(posts.count)")

    for item in 0...posts.count - 1 {
        let indexP = NSIndexPath(forItem: item, inSection: 0)
        followCollectionView.deselectItemAtIndexPath(indexP, animated: true)
        let cell = followCollectionView.cellForItemAtIndexPath(indexP) as! FollowCell
        cell.checkImg.hidden = true
    }
}

Сбой программы здесь дает мне фатальную ошибку: Неожиданно нашел нуль, разворачивая дополнительную ошибку в

let cell = followCollectionView.cellForItemAtIndexPath(indexP) as! FollowCell

Я не знаю, почему у меня возникли проблемы с распаковкой ячейки, которая будет моим FollowCell, который содержит экземпляр checkImg. Я уже использовал его раньше в аналогичной ситуации в файле didSelectItemAtIndexPath и, похоже, работает?

Спасибо,

Ответ 1

Не все выбранные ячейки могут отображаться на экране в момент, когда вы очищаете статус выбора, поэтому collectionView.cellForItemAtIndexPath(indexPath) может возвращать нуль. Поскольку у вас есть силовое понижение, вы получите исключение в этом случае.

Вам нужно изменить свой код, чтобы обработать потенциальное условие nil, но вы также можете сделать свой код более эффективным с помощью свойства indexPathsForSelectedItems UICollectionView

 let selectedItems = followCollectionView.indexPathsForSelectedItems
 for (indexPath in selectedItems) {
     followCollectionView.deselectItemAtIndexPath(indexPath, animated:true)
     if let cell = followCollectionView.cellForItemAtIndexPath(indexPath) as? FollowCell {
        cell.checkImg.hidden = true
     }
 }

Ответ 2

Использование расширения в Swift 4

extension UICollectionView {

    func deselectAllItems(animated: Bool) {
        guard let selectedItems = indexPathsForSelectedItems else { return }
        for indexPath in selectedItems { deselectItem(at: indexPath, animated: animated) }
    }
}

Ответ 3

Чтобы упростить дальнейшее, вы можете просто сделать

followCollectionView.allowsSelection = false
followCollectionView.allowsSelection = true

Это на самом деле правильно очистит ваш followCollectionView.indexPathsForSelectedItems, даже если это выглядит очень неправильно.