Search code examples
audioswift3avaudioplayer

Button Image Repeated On cell


I want to play audio on click on cell. And change button image.They work fine. But when i am scroll my 4 cell button image automatically change.Please help. Any Help would be appreciated.

   @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
    }

Solution

  • Basically whenever you scroll down/top/left/right and your marked cell going to out of bounds then whenever you back with scroll the cellForRowAt going to be called once more.

    I sugest you to create dictionary with [UITableViewCell : Bool] and inside :

    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)
            }
    

    Later on inside :

    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
        }