web-dev-qa-db-fra.com

Comment les cellules sont-elles désélectionnées par programme dans UICollectionView lorsque allowMultipleSelection est activé?

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é

34
Steve

Vous pouvez parcourir - [UICollectionView indexPathsForSelectedItems]:

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

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.

19
taherh

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.

11
fguchelaar

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)
        }
    }
}
4
Valentin Shergin

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)
        }
    }
}
2
KIO

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];
        }
1
Varun Naharia

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
    }


}
0
retrovius

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)
}
0
Lance Samaria

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
0
cnotethegr8