单击时在 uicollectionviewcell 中切换图像

Posted

技术标签:

【中文标题】单击时在 uicollectionviewcell 中切换图像【英文标题】:Toggle image within uicollectionviewcell when clicked 【发布时间】:2019-02-16 22:33:41 【问题描述】:

我有一个带有一系列自定义类单元格的 uicollectionview,其中包含一些文本视图和一个 uibutton。有超过 100 个单元格,我只想切换每个单元格的 uibutton 图像。 uibutton 是一个收藏按钮,与大多数应用程序一样,我只想收藏和“取消收藏”不同的单元格。

注意:我尝试直接在类中添加手势识别器,但由于某种原因,图像发生了变化,但它突出显示了多个单元格,而不是被点击的特定单元格

我的代码:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SimpleExampleSubCell
        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"]
        
        cell.bringSubview(toFront: cell.headerTextVw)
        cell.favorite_button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(AddFavorite(withSender:))))
        return cell
    


    @objc func AddFavorite(withSender sender:UIButton)
        print("clicked")
        //The line below fails each time I run it.
        sender.setImage(newImage.png,.normal)
    

【问题讨论】:

【参考方案1】:

替换

@objc func addFavorite(withSender sender:UIButton)
    

// not recommended use touchUpInside
@objc func addFavorite(_ sender:UITapGestureRecognizer)
  let btn = sender.view! as! UIButton

或者更好

cell.favorite_button.addTarget(self, action:#selector(addFavorite), for: .touchUpInside)

    

不要向按钮添加轻触,因为它们有自己的目标,例如 touchUpInside 或 touchUpOutside 等等

表格单元格被重复使用,您需要在 cellForRowAt 中将它们设为 nil 或给出 else

if someCondition  
   cell.favorite_button.setImage(newImage1.png,.normal)
else  
  cell.favorite_button.setImage(newImage2.png,.normal)

【讨论】:

我根据您的建议更改了我的发件人选项,但是当我尝试编写行来设置图像时,我收到了一个未解决的标识符错误。 这绝对有效,这就是我接受它作为答案的原因,但是当我向上滚动浏览我的单元格时,它似乎突出了同一个单元格的位置。例如,我有 100 多个单元格,但一次只能查看 4 个单元格。当我单击第一个单元格的按钮时,它会根据需要更改,但是当我向上滚动滚动后视图中显示的第一个单元格时,现在有一个突出显示的收藏夹按钮图像。它随着我滚动而改变。 细胞被重复使用你想保存它的模型中每个细胞的当前状态 你能举个例子吗?【参考方案2】:

您必须在 prepareForReuse() 方法中为每个单元格设置默认图像(以及您想要重置的所有内容),以便清除重复使用的内容

【讨论】:

以上是关于单击时在 uicollectionviewcell 中切换图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 UICollectionViewFlowLayout 时在 UICollectionViewCell 的边界之外绘制

awakeFromNib() 在滚动开始时在 UICollectionViewCell 子类中调用了两次

插入 UICollectionViewCell 时在 iOS 10.3.1 上崩溃

单击后如何关闭突出显示的 UICollectionViewCell?

单击按钮 UICollectionViewCell 宽度和高度更改

UICollectionViewCell 中的按钮在单击时发出键盘声音