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?