ios - UICollectionViewCell 在 collectionview 的多个单元格中看到的一个更改

标签 ios swift uicollectionview uicollectionviewcell

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

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

此代码中是否缺少某些内容?

注意::默认情况下,我将每个单元格的 bool 值设置为 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)
        }

    }

最佳答案

这是因为您正在使用 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)
    }

}

关于ios - UICollectionViewCell 在 collectionview 的多个单元格中看到的一个更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54730722/

相关文章:

ios - 如何完全卸载 Xcode 并清除所有设置

swift - 一页中的两个collectionView具有不同的数据

ios - 为 collectionView 中的每个其他项目设置特定布局

ios - 检测内容已经插入到UIcollectionview

ios - 构建 TensorFlowLite Swift 自定义框架

ios - 错误 : Unable to resolve build file: XCBCore. 构建文件

ios - ImageView 图像动画应用程序在启动时崩溃 [SWIFT]

swift - 如何使用 AVAssetWriter 同步视频和音频?

arrays - 快速引用对象

ios - UINavigationBar的完全自定义