【问题标题】:UICollectionView and Selected Cell loses selection while scrollingUICollectionView 和 Selected Cell 在滚动时失去选择
【发布时间】:2015-10-25 05:05:56
【问题描述】:

我有一个 UICollectionView,一切正常,但是,有一件事情我无法处理(我不知道如何处理),我有一个单元格集合,可以查看用户需要滚动的所有单元格像往常一样向下或向上。

当用户选择单元格时,内容变为“红色”,红色为“选中”单元格,黑色为“未选中”单元格或正常状态。

当所选单元格落在导航栏或标签栏后面时,该单元将失去“红色”并再次变为黑色,如“未选择”。

如何在 uicollectionview 滚动时单元格落后时保持“红色”?

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    let cell = collectionView.cellForItemAtIndexPath(indexPath)

    let icon = cell!.viewWithTag(10) as? UIImageView
    icon!.image = icon!.image! .imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
    icon!.tintColor = UIColor.redColor()

    let label = cell!.viewWithTag(100) as? UILabel
    label?.textColor = UIColor.redColor()
    //print("Seleccionado")

}

override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
    let cell = collectionView.cellForItemAtIndexPath(indexPath)

    cell!.contentView.backgroundColor = nil
    cell!.contentView.layer.borderColor = nil

    let icon = cell!.viewWithTag(10) as? UIImageView
    icon!.image = icon!.image! .imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
    icon!.tintColor = UIColor.blackColor()

    let label = cell!.viewWithTag(100) as? UILabel
    label?.textColor = UIColor.lightGrayColor()
    //print("Unselect")
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ObjectosCollectionViewCell

    cell.objectoNameLabel.text = objectosData[indexPath.row]
    cell.objectoNameLabel.textColor = UIColor.lightGrayColor()
    cell.objectoImageView.image = UIImage(named:objectosImage[indexPath.row])

    return cell
}

谢谢

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell


    【解决方案1】:

    你需要对你的逻辑做一些修改;

    //CollectionViewCell Custom Class
    import UIKit
    
    class CollectionViewCell: UICollectionViewCell {
    
        override var selected: Bool {
            get {
                return super.selected;
            }
    
            set {
                if (super.selected != newValue) {
                    super.selected = newValue
    
                    let icon = self.viewWithTag(10) as? UIImageView
                    icon?.image = icon?.image!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
    
                    let label = self.viewWithTag(100) as? UILabel
    
                    if (newValue == true) {
                        icon?.tintColor = UIColor.redColor()
                        label?.textColor = UIColor.redColor()
                    } else {
                        icon?.tintColor = UIColor.blackColor()
                        label?.textColor = UIColor.lightGrayColor()
                    }
                }
            }
        } //P.E.
    
    }
    

    然后;

    //Define a class variable in your viewController
    var cellStatus:NSMutableDictionary = NSMutableDictionary();
    
    //Collection view delegate methods
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    
        var cell:CollectionViewCell? = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as? CollectionViewCell;
    
        cell!.selected = (cellStatus[indexPath.row] as? Bool) ?? false;
    
        return cell!;
    }
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        //Updating cell status
        let cell = collectionView.cellForItemAtIndexPath(indexPath)
        cell?.selected = true;
    
        //Updating dic
        self.cellStatus[indexPath.row] = true;
    }
    
    func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
        //Updating cell status
        let cell = collectionView.cellForItemAtIndexPath(indexPath)
        cell?.selected = false;
    
        //Updating dic
        self.cellStatus[indexPath.row] = false;
    }
    

    注意:改变图片图标颜色的方法不好。它占用了太多的处理能力,可能会挂起滚动。每个状态应该使用两个单独的图像。

    【讨论】:

    • 谢谢,我喜欢这个解决方案,我试过了,但一切又变回黑色了
    • 在实施我建议的解决方案时,您是否删除了将图像和标签颜色更改为黑色的代码?
    • 我删除了它,因为我在 CollectionViewCell 中看到了相同的代码
    • 代码运行良好。你一定错过了什么。尝试找出问题所在。供参考,您可以在此处查看示例代码files.fm/u/vofdysq
    【解决方案2】:

    这发生在我的 UITableView 上,似乎每次您上下滚动显示更多元素时,单元格都会再次呈现。所以我遇到的解决方案是创建一个名为 selecteditems 的数组,每次用户选择该单元格时,都会将该单元格的索引保存在数组中。 像这样

      override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    let cell = collectionView.cellForItemAtIndexPath(indexPath)
    
    let icon = cell!.viewWithTag(10) as? UIImageView
    icon!.image = icon!.image! .imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
    icon!.tintColor = UIColor.redColor()
    
    let label = cell!.viewWithTag(100) as? UILabel
    label?.textColor = UIColor.redColor()
    
    //Save in array
    selecteditems.append(indexPath.row)
    

    }

    override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
        let cell = collectionView.cellForItemAtIndexPath(indexPath)
    
        cell!.contentView.backgroundColor = nil
        cell!.contentView.layer.borderColor = nil
    
        let icon = cell!.viewWithTag(10) as? UIImageView
        icon!.image = icon!.image! .imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
        icon!.tintColor = UIColor.blackColor()
    
        let label = cell!.viewWithTag(100) as? UILabel
        label?.textColor = UIColor.lightGrayColor()
    
    
        if selecteditems.contains(indexPath.row){
          // place your code to be red
        }
    
    }
    

    【讨论】:

    • 谢谢,我试过了,但没有任何变化,确定我的元素有数组,但一切又变黑了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多