正在从 collection 视图自动播放下一个音频文件

Automatically playing next audio file from collection view

我正在构建有声读物应用。 我的 collection 视图单元格中有播放按钮,用户可以在其中查看所有 mp3 文件的列表。当用户按下此按钮(播放按钮)时 - 我正在将曲目数据发送到我的播放器 class 并且音乐文件开始播放。我正在使用全局变量将曲目详细信息发送给我的播放器。

这是我的代码:

extension ChapterDetailsViewController: AliaCellDelegate {

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

我需要实现这样的功能:当曲目结束时 - 自动播放同一列表中的下一个文件。为此,我的播放器 class 中有这个方法,当播放结束时它会通知我:

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

但我不知道如何在我的播放器 func playerDidFinishPlaying(note: NSNotification) 中调用 func playAlia(cell: AliaCell) 并从我的 collection 视图传递下一首曲目的详细信息。

目前我只创建了: NotificationCenter.default.addObserver(self, selector: #selector(playNext), name: NSNotification.Name(rawValue: "playNext"), object: nil) 但接下来我该做什么?

一个简单的解决方案是跟踪源模型中的现有轨道。这个例子做了很多假设,是不是不完整。

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

}