Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView and selected UICollectionViewCell

I'm trying to do a simple UICollectionView with a custom cell composed of an UIImageView and an UIView above.

When a cell is not selected, the UIView on the top of the cell have is backgroundColor property set to UIColor(red: 1, green: 1, blue: 1, alpha: 0.5).

I have issues with the selection. The collectionView:didSelectItemAtIndexPath: method is called but when I change the UIView described previously, nothing happen.

Here is the code of my collectionView :

class TestCollectionViewController: UICollectionViewController
{
    var items = [1, 2, 3]

    let cellId = "Cell"

    override func viewDidLoad()
    {
        self.collectionView.allowsMultipleSelection = true
        self.collectionView.delaysContentTouches = false
    }

    override func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int
    {
        return items.count
    }

    override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
    {
        var cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellId,
            forIndexPath: indexPath) as TestingCollectionViewCell

        let item = items[indexPath.row]

        cell.imageView.image = UIImage(named: "img")
        cell.overlayView.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5)

        return cell
    }

    override func collectionView(collectionView: UICollectionView!, didSelectItemAtIndexPath indexPath: NSIndexPath!)
    {
        var cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellId,
            forIndexPath: indexPath) as TestingCollectionViewCell

        cell.overlayView.backgroundColor = UIColor.clearColor()
    }

    override func collectionView(collectionView: UICollectionView!, didDeselectItemAtIndexPath indexPath: NSIndexPath!)
    {
        var cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellId,
            forIndexPath: indexPath) as TestingCollectionViewCell

        cell.overlayView.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5)
    }
}

If this snippet is not enough, here is my project

like image 908
Morniak Avatar asked Mar 24 '26 19:03

Morniak


1 Answers

You should not be dequeuing a new cell in didSelectItemAtIndexPath (or in didDeselect either) -- this is creating (or reusing) a new cell, not getting the one you selected. Use this instead,

var cell = collectionView.cellForItemAtIndexPath(indexPath)
like image 80
rdelmar Avatar answered Mar 27 '26 10:03

rdelmar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!