2015-05-22 9 views
12

Sto creando la vista Raccolta in modo programmatico. Ecco il codice in viewDidLoad funcCome ottenere cellInIndex in UICollectionView con swift?

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!) 

E questi sono i miei collezione guarda funzioni

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 
} 

idea è che ho un pulsante nella cella, e quando premo che la cellula dovrebbe cambiare colore, qui è la funzione di azione

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

e questo è di 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) 
} 

}

Il pulsante e le opere d'azione ma la cella non cambia colore, credo che il problema è in questa linea

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

risposta

36

Questo è il modo per ottenere la cella alla data indexPath:

let cell = collectionView!.cellForItemAtIndexPath(indexPath) 

Tuttavia, si potrebbe anche voler provare:

cell.contentView.backgroundColor = UIColor.blueColor() 

NOTA:

Anche se quanto sopra può aver funzionato, voglio incoraggiarvi a provare una diversa implementazione per ottenere la stessa funzionalità. La tua implementazione richiede di avere una Action # separata per ogni CollectionViewCell, oltre a creare manualmente indexPath in ciascuno di questi metodi, quando potresti potenzialmente averne uno solo!

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 
} 

e la funzione per che un metodo sarebbe qualcosa di simile:

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() 
} 

Solo un suggerimento! Buona programmazione! :)

+0

Perfetto! Grazie! – Jeff

0

cercare cell.selected e quindi modificare il colore

0

In Swift 2 è possibile ottenere la riga con:

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

questo codice è per UITableView, non UICollectionView come richiesto dal richiedente. – benhameen