Как остановить песню при повторном щелчке по представлению таблицы и воспроизвести другую песню при нажатии на другую ячейку - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть несколько песен и показаны в виде таблицы.Когда я нажимаю на ячейку, она играет песню.Я хочу остановиться, когда коснусь той же ячейки, но если я коснусь другой ячейки, я хочу, чтобы она продолжала играть с новой песней.

extension SoundsViewController: UITableViewDataSource,UITableViewDelegate{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return songs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = myTableView.dequeueReusableCell(withIdentifier: "soundsCell") as! SoundsTableViewCell
    cell.soundPicture.image = UIImage(named: "cell1")
    cell.soundLabel.text = songs[indexPath.row]
    cell.playStopImage.image = UIImage(named: "play")

    if selectedItemIndex == indexPath.row {
      cell.playStopImage.image = UIImage(named: "pause")
    }
    return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 120
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.selectedItemIndex = indexPath.row
    playSong(song: songs[indexPath.row], selectedItemIndex: selectedItemIndex!)
    self.myTableView.reloadData()
}

}

func playSong(song: String, selectedItemIndex: Int){
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: song, ofType: "mp3")!))
        audioPlayer.numberOfLoops = -1
        audioPlayer.play()
        var audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(AVAudioSessionCategoryPlayback)
        }catch{
            print(error)
        }
    }catch{
        print(error)
    }
}

1 Ответ

0 голосов
/ 27 сентября 2018

предположительно, ваш audioPlayer является переменной экземпляра вашего контроллера представления.

Измените функцию playSong на функцию audioPlayer.stop () перед созданием нового AVAudioPlayer.Это должно остановить предыдущий звук.

РЕДАКТИРОВАТЬ:

Добавить функцию, подобную этой к вашему контроллеру представления:

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if let selectedRow = tableView.indexPathForSelectedRow {
        print("Deselecting row \(selectedRow.row). Stop playing sound")
        audioPlayer.stopPlaying()
        tableView.deselectRow(at: indexPath, animated: false)
        if selectedRow == indexPath {
            return nil
        }
    }
    print("Selecting row \(indexPath.row). Start playing sound")
    playSong(song: songs[indexPath.row], selectedItemIndex: selectedItemIndex!)
    return indexPath
}
...