web-dev-qa-db-fra.com

Comment sélectionner un élément dans collectionview par programme?

J'ai un UICollectionView. La UICollectionView 's datasource est une NSArray d'étudiants (de CoreData). Je veux que l’élément étudiant actuel soit selected/highlighted.

Comment puis-je faire ceci? Je sais qu'il existe une méthode:

- (void)selectItemAtIndexPath:(NSIndexPath *)indexPath 
                     animated:(BOOL)animated 
               scrollPosition:(UICollectionViewScrollPosition)scrollPosition;

qui prend comme arguments les variables NSIndexPath et UICollectionViewScrollPosition.

J'ai la source de données (NSArray d'élèves peuplée de CoreData) et l'objet élève comme étant selected.

Alors, comment puis-je obtenir les NSIndexPath et UICollectionViewScrollPosition? Ou existe-t-il un autre moyen de surligner un élément?

12
mrd

Vous pouvez simplement l'utiliser après le [self.collectionView reloadData]

[self.collectionView 
   selectItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0] 
                animated:YES
          scrollPosition:UICollectionViewScrollPositionCenteredVertically];

index est le numéro d'index de l'élève sélectionné.

22
Shahin

Rapide

let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionView.ScrollPosition.centeredHorizontally)
8
Krunal

D'après votre question, je suppose que vous n'avez jamais sélectionné qu'un seul élève, mais j'ai également fait une chose similaire avec une collection d'icônes que l'utilisateur pourrait sélectionner . Tout d'abord vu que j'ai chargé:

override func viewDidLoad() {
    super.viewDidLoad()

    iconCollectionView.delegate = self
    iconCollectionView.dataSource = self
    iconCollectionView.allowsMultipleSelection = false
    iconCollectionView.selectItemAtIndexPath(NSIndexPath(forItem: 0, inSection: 0), animated: false, scrollPosition: .None)
}

Ici, je sélectionne par défaut la première cellule, vous utiliseriez StudentArray.indexOf pour obtenir votre index d’étudiant sélectionné. Ensuite, pour montrer quel élément est sélectionné j'ai fait:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = iconCollectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! IconCollectionViewCell
    cell.imageView.image = UIImage(named: imageResourceNames.pngImageNames[indexPath.row])
    if cell.selected {
        cell.backgroundColor = UIColor.grayColor()
    }
    return cell
}

Ceci est appelé lorsque la collection est affichée pour la première fois, puis pour réagir aux changements de sélection:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor()
}

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.clearColor()
}

Évidemment, il y a beaucoup de façons de montrer la sélection des cellules. Mon chemin est simple mais c'est tout ce que j'avais à faire.

EDIT: Depuis que j'ai posté ce qui précède, j'ai compris qu'il était plus simple d'ajouter simplement un observateur à selected dans la classe de cellules:

class IconCollectionViewCell: UICollectionViewCell {

...

    override var selected: Bool {
        didSet {
            backgroundColor = selected ? UIColor.grayColor() : UIColor.clearColor()
        }
    }
}

Avec cette option en place, il n’est pas nécessaire de manipuler didSelect ou didDeselect ou de rechercher une sélection dans cellForItemAtIndexPath, la cellule le fait automatiquement.

6
sgib
let indexPathForFirstRow = IndexPath(row: 0, section: 0)
    paymentHeaderCollectionView.selectItem(at: indexPathForFirstRow, animated: false, scrollPosition: UICollectionViewScrollPosition.left)
    self.collectionView(paymentHeaderCollectionView, didSelectItemAt: indexPathForFirstRow)
0
Vishal Chaudhari