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,
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
}
}
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) }
}
}
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
}
}
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.