Comment accéder aux buttons d'un UICollectionView à partir d'un set de fonctions cible (Swift 3)

Dans mon controller de vue, j'ai une vue de collection qui, une fois rendue, affiche 3 cellules, chacune ayant une label, et un button. L'label affiche le nom d'une couleur et le button possède une image d'arrière-plan qui affiche un échantillon de couleur.

Je le veux pour que chaque fois que vous click l'un des buttons, ce button soit entouré d'une bordure sombre, tandis que les autres buttons reçoivent une bordure claire pour indiquer que le button a été sélectionné. Alternativement, je pourrais probablement le faire en changeant l'image en fonction de l'état sélectionné de l'image – mais ma question rest la même.

Comment puis-je accéder aux deux autres buttons pour basculer entre leurs propriétés?

J'ai un script implémenté qui me permet d'append une bordure au button sur lequel quelqu'un a cliqué – mais je n'arrive pas à comprendre comment accéder aux autres buttons, dans les autres cellules du CollectionView pour modifier leurs propriétés de bordure.

Voici mon code source (avec les bits non pertinents / non liés retirés)

class sortingmSelectorVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { @IBOutlet weak var sortingmSelector: UICollectionView! struct sortingmObject { var sortingmName: Ssortingng var sortingmButton: Ssortingng var sortingmID: Int } var sortingmArray: [sortingmObject] = [] override func viewDidLoad() { super.viewDidLoad() sortingmArray.append(sortingmObject(sortingmName: "Chrome", sortingmButton: "chrome-swatch", sortingmID: 0)) sortingmArray.append(sortingmObject(sortingmName: "Gold", sortingmButton: "gold-swatch", sortingmID: 1)) sortingmArray.append(sortingmObject(sortingmName: "Gun Metal", sortingmButton: "gunmetal-swatch", sortingmID: 2)) sortingmSelector.delegate = self sortingmSelector.dataSource = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return sortingmArray.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! sortingmSelectionCell //Set the label text cell.sortingmLabel.text = sortingmArray[indexPath.item].sortingmName //Set the image for the button cell.sortingmButton.setImage(UIImage(named: sortingmArray[indexPath.item].sortingmButton), for: UIControlState.normal) //Sets a target function for the button cell.sortingmButton.addTarget(self, action: #selector(selectedSwatch), for: .touchUpInside) return cell } func selectedSwatch(sender: UIButton) { //These set the "selected" border to the button you clicked on. sender.layer.borderWidth = 2 sender.layer.borderColor = UIColor(red: 83/255, green: 71/255, blue: 65/255, alpha: 1.00).cgColor } } 

Quelqu'un peut-il me dire comment accéder aux autres buttons de ma fonction "selectedSwatch"?

Il y a plusieurs façons de gérer cela. Une vue UICollectionView a une méthode visibleCells() qui returnne un tableau de ses cellules visibles. Vous pouvez l'utiliser pour get des pointeurs sur vos cellules. Vous auriez besoin d'un moyen de savoir lequel est lequel. Vous pouvez utiliser indexPath(for: UICollectionViewCell) pour déterminer le path d'index de chaque cellule, par exemple.

Je ne sais pas si cela peut aider, mais qu'en est-il si vous stockez l'IndexPath sur votre méthode struct on cellForItemAt?

Tu vas avoir:

 struct sortingmObject { var sortingmName: Ssortingng var sortingmButton: Ssortingng var sortingmID: Int var idx : IndexPath } 

Puis sur:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! sortingmSelectionCell .... sortingmArray[indexPath.item].idx = indexPath .... } 

Et dans votre méthode SelectedSwatch:

 func selectedSwatch(sender: UIButton) { //These set the "selected" border to the button you clicked on. sender.layer.borderWidth = 2 sender.layer.borderColor = UIColor(red: 83/255, green: 71/255, blue: 65/255, alpha: 1.00).cgColor if let cell = (sender.superview as? UICollectionViewCell) { //Cell with the button selected: let idx = collectionView.indexPath(for: cell) //array of the other objects: let allOtherObjects = sortingmArray.filter { ($0 as! sortingmObject).idx != idx } allOtherObject.forEach({ (sortingmObj) in let cell = collection.cellForItem(at: sortingmObj.idx) //Do whatever yo need to do... //cell.sortingmButton.layer }) } }