按钮图像在单元格上重复

Posted

技术标签:

【中文标题】按钮图像在单元格上重复【英文标题】:Button Image Repeated On cell 【发布时间】:2017-07-26 14:31:03 【问题描述】:

我想在单击单元格时播放音频。并更改按钮图像。它们工作正常。但是当我滚动我的 4 单元格按钮图像时会自动更改。请帮忙。任何帮助将不胜感激。

   @IBAction func playSong (_ sender : UIButton , event: UIEvent)


    let buttonPosition:CGPoint =  sender.convert(.zero, to: table)
    let indexPath = self.table.indexPathForRow(at: buttonPosition)
    let cell = table.cellForRow(at: indexPath!) as? CustumCell
    let a = URL(string : "http://www.abstractpath.com/files/audiosamples/sample.mp3")


        if((audioPlayers) != nil)
            audioPlayers = nil
        
        audioPlayers = AVPlayer(url: a!)

        if sender.isSelected == false 
            sender.isSelected = true
             audioPlayers?.play()
            cell?.play.setImage(UIImage(named : "homestop"), for: .normal)
        else
            sender.isSelected = false
            audioPlayers?.pause()
           cell?.play.setImage(UIImage(named : "homeplay"), for: .normal)
        


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let identifier = "CustumCell"
        var cell: CustumCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? CustumCell
        if cell == nil 
            var nib : Array = Bundle.main.loadNibNamed("CustumCell",owner: self,options: nil)!
            cell = nib[4] as? CustumCell
        
        cell.reportView.isHidden = true
        cell.play.tag = indexPath.row
        cell.play.addTarget(self, action:#selector(playSong(_:event:)), for: .touchUpInside)
        cell.homereport.tag = indexPath.row
        cell.homereport.addTarget(self, action:#selector(showReportView(_:)), for: .touchUpInside)
        return cell
    

【问题讨论】:

【参考方案1】:

基本上,每当您向下/上/左/右滚动并且标记的单元格超出范围时,然后每当您滚动返回时,cellForRowAt 将再次被调用。

我建议你用[UITableViewCell : Bool] 和内部创建字典:

if sender.isSelected == false 
            sender.isSelected = true
             audioPlayers?.play()
            dic[cell] = true
            cell?.play.setImage(UIImage(named : "homestop"), for: .normal)
        else
            sender.isSelected = false
            audioPlayers?.pause()
           dic[cell] = false
           cell?.play.setImage(UIImage(named : "homeplay"), for: .normal)
        

稍后在里面:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let identifier = "CustumCell"
        var cell: CustumCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? CustumCell
        if cell == nil 
            var nib : Array = Bundle.main.loadNibNamed("CustumCell",owner: self,options: nil)!
            cell = nib[4] as? CustumCell
        
        cell.reportView.isHidden = true
        cell.play.tag = indexPath.row
        cell.play.addTarget(self, action:#selector(playSong(_:event:)), for: .touchUpInside)
        cell.homereport.tag = indexPath.row
        cell.homereport.addTarget(self, action:#selector(showReportView(_:)), for: .touchUpInside)

        if dic[cell] 
        // Set the image of the button or what ever you like to :)  
        
        return cell
    

【讨论】:

以上是关于按钮图像在单元格上重复的主要内容,如果未能解决你的问题,请参考以下文章

单元格中的选定按钮显示在重用单元格上 - 也使用 sender.tag 进行按钮区分

更改自定义单元格中按钮的图像

按钮状态在错误的单元格上激活

在表格视图中按下单元格上的按钮时如何创建新单元格

在 iPhone 中的单元格上获取选中和未选中按钮问题

当点击单元格上的按钮时,将信息写入单元格中