it-swarm.com.de

Wie bekomme ich in UICollectionView einen Zellen-atIndex mit Swift?

Ich mache die Collection-Ansicht programmgesteuert ..__ Hier ist der Code in viewDidLoad-Funktion

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

Und dies sind meine Sammlungsansichtsfunktionen

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
}

Ich habe eine Schaltfläche in der Zelle, und wenn ich sie drücke, sollte die Farbe der Zelle geändert werden

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

und dies ist die collectionViewCell-Klasse, 

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

}

Die Schaltfläche und die Aktion funktionieren, aber die Zelle ändert ihre Farbe nicht. Ich denke, das Problem liegt in dieser Zeile

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

Auf diese Weise können Sie die Zelle an einem bestimmten Indexpfad abrufen:

let cell = collectionView!.cellForItemAtIndexPath(indexPath)

Möglicherweise möchten Sie jedoch auch Folgendes versuchen:

cell.contentView.backgroundColor = UIColor.blueColor()

HINWEIS:  

Obwohl die obigen Ausführungen möglicherweise funktioniert haben, möchte ich Sie dazu ermutigen, eine andere Implementierung zu versuchen, um dieselbe Funktionalität zu erreichen. Ihre Implementierung würde erfordern, dass Sie für jede CollectionViewCell eine eigene Action # -Funktion haben und den indexPath in jeder dieser Methoden manuell erstellen, wenn Sie möglicherweise nur eine haben!

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
}

und die Funktion für diese eine Methode wäre etwa so:

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

Nur ein Vorschlag! Viel Spaß beim Codieren! :)

46
benhameen

In Swift 4 können Sie die Zelle von CollectionView erhalten mit:

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

In Swift 2 können Sie die Reihe mit bekommen: 

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

versuchen Sie es mit cell.selected und ändern Sie dann die Farbe

0
SameerVerma