J'ai allowMultipleSelection activé dans une vue de collection. Les cellules changent vers et depuis leurs états sélectionnés lorsqu'elles sont tapées. Tout bon. Cependant, lorsque je veux réinitialiser la vue entière à l'état sélectionné: NON à l'aide du code ci-dessous, les cellules semblent être entièrement désélectionnées jusqu'à ce que je fasse une nouvelle sélection, auquel cas toutes les cellules précédemment sélectionnées montrent leur état précédemment sélectionné.
c'est-à-dire qu'en dépit des apparences, la collectionview ne met pas à jour sa liste de sélection actuelle lorsque je désélectionne par programme les cellules
- (void)clearCellSelections {
for (LetterCell *cell in self.collectionView.visibleCells) {
[cell prepareForReuse];
}
}
Dans une cellule personnalisée:
- (void)prepareForReuse
{
[super prepareForReuse];
[self setSelected:NO];
}
Qu'est-ce que je fais mal? Existe-t-il une autre façon de désélectionner toutes les cellules?
Merci TBlue d'avoir regardé
Vous pouvez parcourir - [UICollectionView indexPathsForSelectedItems]
:
for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) {
[self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
}
La manière la plus simple de désélectionner toutes les cellules sélectionnées dans un UICollectionView
est simplement de passer nil
comme premier argument à collectionView.selectItem(at:, animated:, scrollPosition:)
. Par exemple.,
collectionView.selectItem(at: nil, animated: true, scrollPosition: [])
effacera l'état de sélection actuel, même lorsque allowsMultipleSelection == true
.
Vous pourriez dire ça UITableViewCell.selected
définit uniquement "l'état/l'apparence visible" de la cellule et son contenu. Vous pouvez désélectionner les cellules, en itérant sur tous les chemins d'index de la tableView et appelez deselectRowAtIndexPath:animated:
pour chacun.
Par exemple:
for (int i=0; i < self.myData.count; i++) {
[self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] animated:YES];
}
EDIT : Je suis totalement d'accord avec les commentaires de @BenLings et @ JeremyWiebe, que la solution de @ qorkfiend est préférée à celle-ci.
Juste au cas où cela serait une solution simple dans Swift:
extension UICollectionView {
func deselectAllItems(animated animated: Bool = false) {
for indexPath in self.indexPathsForSelectedItems() ?? [] {
self.deselectItemAtIndexPath(indexPath, animated: animated)
}
}
}
Pour Swift 3 Extension ressemblerait à ceci:
import UIKit
extension UICollectionView {
func deselectAllItems(animated: Bool = false) {
for indexPath in self.indexPathsForSelectedItems ?? [] {
self.deselectItem(at: indexPath, animated: animated)
}
}
}
Ceci est terminé si vous souhaitez déléguer également être appelé
for (NSIndexPath *indexPath in [self.cuisineCollection indexPathsForSelectedItems]) {
[self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
[collectionView.delegate collectionView:cuisineCollection didDeselectItemAtIndexPath:indexPath];
}
J'ai créé une variable globale appelée toggleCellSelection, puis l'ai exécutée dans la fonction 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
}
}
C'est la réponse @qorkfiend dans Swift
// this is an array of the selected item(s) indexPaths
guard let indexPaths = collectionView.indexPathsForSelectedItems else { return }
// loop through the array and individually deselect each item
for indexPath in indexPaths{
collectionView.deselectItem(at: indexPath, animated: true)
}
Non pas que cette réponse soit nécessairement "la meilleure", mais comme personne ne l'a mentionnée, je vais l'ajouter.
Vous pouvez simplement appeler ce qui suit.
collectionView.allowsSelection = false
collectionView.allowsSelection = true