正在从 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)
}
}
我正在构建有声读物应用。 我的 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)
}
}