UICollectionViewCell 在collectionview的多个单元格中看到的一个变化

Posted

技术标签:

【中文标题】UICollectionViewCell 在collectionview的多个单元格中看到的一个变化【英文标题】:UICollectionViewCell change in one seen in multiple cells in collectionview 【发布时间】:2019-02-17 06:23:48 【问题描述】:

我有一个带有 collectionviewcells 的 uicollectionview,每个单元格都有一个与收藏按钮关联的布尔值。有超过 50 个垂直放置的单元格(一次可以查看四个单元格)。如果单击收藏按钮,则会在突出显示的图像和未突出显示的图像之间切换。

该功能有效,但由于某种原因,当我单击一个然后向下滚动时,我看到其他单元格突出显示了他们最喜欢的按钮。当我向上滚动时,单元格收藏按钮不再突出显示。

这段代码有什么遗漏吗?

注意:: 默认情况下,我将每个单元格的布尔值设置为 false。只有当我点击单元格的收藏按钮时它才会改变。

我的代码如下:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SimpleDispensarySubCell
        cell.backgroundColor = UIColor.init(white: 0.10, alpha: 0.25)
        cell.infoLine2TextVw.text = ""
        cell.infoLine3TextVw.text = ""
        if let heading_name = self.dict_dict_holder[indexPath.item]["Name"]
            cell.headerTextVw.text = heading_name
            cell.infoLine1TextVw.text = self.dict_dict_holder[indexPath.item]["Phone"]
        

        if cell.isFavorite
            cell.isFavorite = true
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
        
        else
            cell.isFavorite = false
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
        
        cell.bringSubview(toFront: cell.headerTextVw)
        //cell.favorite_button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(AddFavorite(withSender:))))
        cell.favorite_button.addTarget(self, action:#selector(AddFavorite), for: .touchUpInside)
        return cell
    

    @objc func AddFavorite(withSender sender:UIButton)
        let cell = sender.superview as! SimpleDispensarySubCell

        if cell.isFavorite
            cell.isFavorite = false
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
        
        else
            cell.isFavorite = true
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
        

    

【问题讨论】:

【参考方案1】:

这是因为您使用的是collectionView.dequeueReusableCell,您应该定义一个数组来保存其上每个单元格的最喜欢的状态。它可以解决你的问题。

let favoriteStateArray = countOfRows;

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SimpleDispensarySubCell
    cell.backgroundColor = UIColor.init(white: 0.10, alpha: 0.25)
    cell.infoLine2TextVw.text = ""
    cell.infoLine3TextVw.text = ""
    if let heading_name = self.dict_dict_holder[indexPath.item]["Name"]
        cell.headerTextVw.text = heading_name
        cell.infoLine1TextVw.text = self.dict_dict_holder[indexPath.item]["Phone"]
    

    if favoriteStateArray[indexPath.row]
        cell.isFavorite = true
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
    
    else
        cell.isFavorite = false
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
    
    cell.bringSubview(toFront: cell.headerTextVw)
    //cell.favorite_button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(AddFavorite(withSender:))))
    cell.favorite_button.addTarget(self, action:#selector(AddFavorite), for: .touchUpInside)
    return cell


@objc func AddFavorite(withSender sender:UIButton)
    let cell = sender.superview as! SimpleDispensarySubCell
    let index = collectionView.indexPath(for: cell)
    if favoriteStateArray[indexPath.row]
        favoriteStateArray[indexPath.row] = false
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
    
    else
        favoriteStateArray[indexPath.row] = false
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
    


【讨论】:

【参考方案2】:

由于单元格被重用,更改正在影响多个单元格。 您可以使用准备重用方法来清除必须仅影响特定单元格的更改并清除单元格并准备重用。

override func prepareForReuse() 

     cell.isFavorite = false

    super.prepareForReuse()

【讨论】:

我应该把这个放在哪里? 在自定义单元类中

以上是关于UICollectionViewCell 在collectionview的多个单元格中看到的一个变化的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionViewCell 上设置 .reuseIdentifier

在 UICollectionViewCell 中更新 UITableView

如何在 UICollectionViewCell 中添加 UICollectionView?

如何在 UICollectionViewCell 上设置 UILabel?

UICollectionViewCell 边框/阴影

如何在 iOS 7 中刷新 UICollectionViewCell?