从集合视图自动播放下一个音频文件

时间:2018-11-12 18:57:27

标签: swift uicollectionview sequence avplayer playback

我正在构建有声读物应用程序。 我在收藏视图单元格中有播放按钮,用户可以在其中查看所有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 :(得分:1)

一个简单的解决方案是跟踪源模型中的现有轨道。该示例有很多假设,但还不完整。

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

}