仅更改一个 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.itemrow 用于表格视图。 item 用于集合视图。

【讨论】:

感谢您的快速回复。还有一个问题。我应该如何永久保存它?我写了 self.defaults.set(beenTapped, forKey: "beenTapped") 但它给了我错误以 NSException 类型的未捕获异常终止,我在它之前打印了 beenTapped 并且它具有价值。同样,当我使用另一个被插入的变量时,它也可以正常工作!我该怎么办? 您不能将Set 存储在UserDefaults 中。从集合中创建一个数组并存储该数组。【参考方案2】:

这是对 UICollectionView(或 UITableView)的一种非常常见的误用。在处理它们时,您应该始终牢记一件事,重复使用。需要时,集合/表格视图单元格将被操作系统高度重用。代码中的问题原因是,您假设单元格中一个属性的一次性设置将是持久性,这是错误的。单元格来自出队方法,可以始终是新单元格或现有单元格,因此,任何配置都应应用于单元格应重新配置。以这种方式思考,当从集合视图中获取单元格中的所有视图时,它都是“脏的”,您应该在将其返回之前设置所需的属性(或稍后设置机制)。因此,在您的情况下,每次在 cellForRow 委托中准备单元格时,只需设置 isHidden 属性即可。

【讨论】:

以上是关于仅更改一个 collectionview 单元格的对象的主要内容,如果未能解决你的问题,请参考以下文章

tableView 单元格内的多个 collectionView 单元格在滚动时更改设计

滚动时collectionview更改单元格背景图像

根据 CollectionView 中的选择更改 ImageView

根据单元格的不更改单元格高度动态更改 UICollectionView 高度

使用自定义 collectionView 布局更改单元格大小时如何使用 ScrollToItem(at:)

更改UICollectionView单元格的alpha值无法正常工作