仅更改一个 collectionview 单元格的对象
Posted
技术标签:
【中文标题】仅更改一个 collectionview 单元格的对象【英文标题】:change the objects of just one collectionview cell 【发布时间】:2018-04-28 15:38:13 【问题描述】:我正在尝试做的是,当我点击单元格中的按钮时,该单元格中的按钮变得不可见。问题是当我点击按钮时,它变得不可见,但是当我滚动集合视图时,隐藏的按钮会从一个到另一个。例如,我点击它隐藏的第二个,但是当我滚动时,我看到第 7 个被隐藏了。每次我滚动隐藏按钮时都会发生变化。
这是我写的代码:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell : CollectionViewCellKharid3 = collectionView.dequeueReusableCell(withReuseIdentifier: "customcell3", for: indexPath) as! CollectionViewCellKharid3
cell.lblEsmeMahsul.text = mainCats[indexPath.row]
cell.imgMahsul.af_setImage(withURL: URL(string : (mainadress + "/Opitures/" + mainPicNumbers[indexPath.row]))!, placeholderImage: UIImage(named: "loadings" ))
cell.btnKharid.addTarget(self, action: #selector(btnColectionviewCellTapped), for : UIControlEvents.touchUpInside)
cell.btnKharid.tag = indexPath.row
cell.btnMosbat.addTarget(self, action: #selector(btnMosbatTapped), for : UIControlEvents.touchUpInside)
cell.btnMosbat.tag = indexPath.row
cell.configureCell()
return cell
@objc func btnColectionviewCellTapped(_ sender:UIButton)
// let indexPath : IndexPath = self.collectionview1.ind
print(sender.tag)
sender.isHidden = true
@objc func btnMosbatTapped(_ sender:UIButton)
let index = IndexPath(item: sender.tag , section: 0)
let cell = self.collectionviewForushVije.cellForItem(at: index) as? CollectionViewCellKharid3
cell?.lblTedad.text = "22"
print(sender.tag)
【问题讨论】:
覆盖 prepareforreuse 函数来设置所有的针刺材料。像按钮的可见性状态。单元格被重复使用,如果设置不正确,就会出现问题 【参考方案1】:细胞被重复使用。您需要跟踪哪些单元格已被点击,以便您可以在 cellForItemAt
方法中设置正确的按钮状态。
在你的类中声明一个属性:
var beenTapped: Set<Int> = []
然后在btnColectionviewCellTapped
添加:
beenTapped.insert(sender.tag)
你需要在cellForItemAt
:
cell.btnKharid.isHidden = beenTapped.contains(indexPath.item)
您还应该将indexPath.row
的使用替换为indexPath.item
。 row
用于表格视图。 item
用于集合视图。
【讨论】:
感谢您的快速回复。还有一个问题。我应该如何永久保存它?我写了 self.defaults.set(beenTapped, forKey: "beenTapped") 但它给了我错误以 NSException 类型的未捕获异常终止,我在它之前打印了 beenTapped 并且它具有价值。同样,当我使用另一个被插入的变量时,它也可以正常工作!我该怎么办? 您不能将Set
存储在UserDefaults
中。从集合中创建一个数组并存储该数组。【参考方案2】:
这是对 UICollectionView(或 UITableView)的一种非常常见的误用。在处理它们时,您应该始终牢记一件事,重复使用。需要时,集合/表格视图单元格将被操作系统高度重用。代码中的问题原因是,您假设单元格中一个属性的一次性设置将是持久性,这是错误的。单元格来自出队方法,可以始终是新单元格或现有单元格,因此,任何配置都应应用于单元格应重新配置。以这种方式思考,当从集合视图中获取单元格中的所有视图时,它都是“脏的”,您应该在将其返回之前设置所需的属性(或稍后设置机制)。因此,在您的情况下,每次在 cellForRow 委托中准备单元格时,只需设置 isHidden 属性即可。
【讨论】:
以上是关于仅更改一个 collectionview 单元格的对象的主要内容,如果未能解决你的问题,请参考以下文章
tableView 单元格内的多个 collectionView 单元格在滚动时更改设计
根据 CollectionView 中的选择更改 ImageView
根据单元格的不更改单元格高度动态更改 UICollectionView 高度