web-dev-qa-db-fra.com

Comment obtenir une cellule atIndex dans UICollectionView avec swift?

Je suis en train de faire Collection vue par programme . Voici le code dans viewDidLoad func

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
    layout.itemSize = CGSize(width: 90, height: 120)
    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    collectionView!.dataSource = self
    collectionView!.delegate = self
    collectionView!.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
    collectionView!.layer.cornerRadius = 2
    collectionView!.backgroundColor = UIColor.redColor()
    self.containerView.addSubview(collectionView!)

Et ce sont mes fonctions de vue de collection

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 8
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as! CollectionViewCell
    cell.backgroundColor = UIColor.blackColor()
    cell.buttonView.addTarget(self, action: Selector("Action\(indexPath.row):"), forControlEvents: UIControlEvents.TouchUpInside)
    return cell
}

L'idée est que j'ai un bouton dans la cellule, et quand j'appuie dessus, la cellule devrait changer de couleur, voici la fonction action

func Action0(sender: UIButton!) {
    var indexPath = NSIndexPath(forRow: 0, inSection: 0)
    let cell = collectionView!.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath ) as! CollectionViewCell
    cell.backgroundColor = UIColor.blueColor()

et c'est la classe collectionViewCell, 

class CollectionViewCell: UICollectionViewCell {

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

var buttonView: UIButton!
override init(frame: CGRect) {
    super.init(frame: frame)

    buttonView = UIButton.buttonWithType(UIButtonType.System) as! UIButton
    buttonView.frame = CGRect(x: 0, y: 16, width: frame.size.width, height: frame.size.height*2/3)

    contentView.addSubview(buttonView)
}

}

Le bouton et l'action fonctionnent mais la cellule ne change pas de couleur, je suppose que le problème est dans cette ligne

let cell = collectionView!.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath ) as! CollectionViewCell
15
Josip Bogdan

Voici le moyen d'obtenir la cellule à un indexPath donné:

let cell = collectionView!.cellForItemAtIndexPath(indexPath)

Cependant, vous voudrez peut-être aussi essayer:

cell.contentView.backgroundColor = UIColor.blueColor()

REMARQUE:  

Bien que ce qui précède ait peut-être fonctionné, je tiens à vous encourager à essayer une implémentation différente pour obtenir la même fonctionnalité. Votre implémentation nécessiterait que vous disposiez d'une fonction Action # distincte pour chaque CollectionViewCell, ainsi que de créer manuellement l'indexPath dans chacune de ces méthodes, alors que vous ne pourriez potentiellement en avoir qu'une seule!

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as! CollectionViewCell
    cell.backgroundColor = UIColor.blackColor()
    cell.buttonView.addTarget(self, action: Selector("action"), forControlEvents: UIControlEvents.TouchUpInside)
    return cell
}

et la fonction pour cette méthode serait quelque chose comme:

func action(sender: UIButton!) {
    var point : CGPoint = sender.convertPoint(CGPointZero, toView:collectionView)
    var indexPath = collectionView!.indexPathForItemAtPoint(point)
    let cell = collectionView!.cellForItemAtIndexPath(indexPath)
    cell.backgroundColor = UIColor.blueColor()
}

Juste une suggestion! Bonne codage! :)

46
benhameen

Dans Swift 4, vous pouvez obtenir la cellule de CollectionView avec:

let indexPath = IndexPath(item: 3, section: 0);  
if let cell = myCollectionView .cellForItem(at: indexPath)  
{   
   // do stuff...  
}  
6
Lakhdeep Singh

Dans Swift 2, vous pouvez obtenir la ligne avec: 

let point : CGPoint = sender.convertPoint(CGPointZero, toView:myTableView)
let indexPath = myTableView.indexPathForRowAtPoint(point)
let cell = myTableView.cellForRowAtIndexPath(indexPath!)
0
datayeah

essayez cell.selected puis changez la couleur

0
SameerVerma