Автоматическое воспроизведение следующего аудиофайла из представления коллекции - PullRequest
0 голосов
/ 12 ноября 2018

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

Вот мой код:

extension ChapterDetailsViewController: AliaCellDelegate {

    func playAlia(cell: AliaCell) {
         NotificationCenter.default.post(name: NSNotification.Name(rawValue: "playAudio"), object: nil)
  }
}

Мне нужно реализовать такую ​​функциональность: Когда заканчивается трек - автоматически воспроизводится следующийфайл из того же списка.Для этого у меня есть этот метод внутри моего класса игрока, который сообщает мне, когда он закончил играть:

func playerDidFinishPlaying(note: NSNotification) { 
     print("Finished playing")
}

Но я не знаю, как вызвать func playAlia(cell: AliaCell) внутри func playerDidFinishPlaying(note: NSNotification) в моем плеередетали класса и передачи следующего трека из представления моей коллекции.

На данный момент я создал только: NotificationCenter.default.addObserver(self, selector: #selector(playNext), name: NSNotification.Name(rawValue: "playNext"), object: nil) но что мне делать дальше?

1 Ответ

0 голосов
/ 16 ноября 2018

Простым решением является отслеживание существующего трека в исходной модели.Пример делает множество предположений и не является ли он полным.

struct Track {
    let url: URL
    let title: String
    let artist: String
}    

class AudioPlayer: UIViewController {
    var currentTrackIndex: Int = 0
    let tracks: [Track] = [Track(), Track(), Track()]
    let player: AVPlayer()

    // table view delegate for row selection
    override func tableView(_ tableView: UITableView, 
     didSelectRowAt indexPath: IndexPath) {
        // assuming single section
        currentTrackIndex = indexPath.row
        playTrack(at: currentTrackIndex)
    }

    func playTrack(at index: Int) {
        let nextTrack = tracks[index]
        let nextItem = AVPlayerItem(url: nextTrack.url)
        player.replaceCurrentItem(with: nextItem)
    }

    func playerDidFinishPlaying(note: NSNotification) { 
        // add logic to handle out of bounds index for array 
        currentTrackIndex += 1
        playTrack(at: currentTrackIndex)
    }

}
...