我正在构建有声读物应用程序。 我在收藏视图单元格中有播放按钮,用户可以在其中查看所有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)
,但是下一步我该怎么做?
答案 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)
}
}