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?
Vous pouvez simplement l'utiliser après le [self.collectionView reloadData]
[self.collectionView
selectItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]
animated:YES
scrollPosition:UICollectionViewScrollPositionCenteredVertically];
où index
est le numéro d'index de l'élève sélectionné.
Rapide
let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionView.ScrollPosition.centeredHorizontally)
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.
let indexPathForFirstRow = IndexPath(row: 0, section: 0)
paymentHeaderCollectionView.selectItem(at: indexPathForFirstRow, animated: false, scrollPosition: UICollectionViewScrollPosition.left)
self.collectionView(paymentHeaderCollectionView, didSelectItemAt: indexPathForFirstRow)