web-dev-qa-db-fra.com

UICollectionVoir comment tout désélectionner

J'ai une configuration FollowVC et FollowCell avec la vue Collection. Je peux afficher toutes les données correctement dans ma cellule de vue uIcollection en utilisant le code suivant sans problème.

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

Notez que je pouvais également sélectionner et désélectionner plusieurs images en utilisant le code suivant

    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
}

En mode "Select", je peux effectuer la sélection de chaque cellule et une coche sera affichée sur la cellule. Cependant, ce que je veux faire, c'est d'avoir un bouton d'annulation pour désactiver toutes les cellules sélectionnées et supprimer le checkImg.

J'ai essayé

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

Le programme se bloque ici, ce qui me donne une erreur fatale: trouvé de manière inattendue nul en déballant une erreur facultative à

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

Je ne sais pas pourquoi il a du mal à déballer la cellule pour être ma FollowCell qui contient une instance de checkImg. Je l'ai déjà utilisé auparavant dans une situation similaire dans didSelectItemAtIndexPath et cela semble fonctionner?

Merci,

15
user172902

Toutes les cellules sélectionnées peuvent ne pas être à l'écran au moment où vous effacez l'état de la sélection, donc collectionView.cellForItemAtIndexPath(indexPath) peut retourner nul. Puisque vous avez une force abattue, vous obtiendrez une exception dans ce cas.

Vous devez modifier votre code pour gérer la condition nil potentielle, mais vous pouvez également rendre votre code plus efficace en utilisant la propriété indexPathsForSelectedItems de 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
     }
 }
23
Paulw11

Utilisation de l'extension dans Swift 4

extension UICollectionView {

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

Cette réponse peut être utile dans Swift 4.2

 let selectedItems = followCollectionView.indexPathsForSelectedItems

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

Pour simplifier davantage, vous pouvez simplement faire

followCollectionView.allowsSelection = false
followCollectionView.allowsSelection = true

En fait, cela effacera correctement votre followCollectionView.indexPathsForSelectedItems même si cela semble très incorrect.

0
Teodor Iuliu Radu