所以我有一个UITableViewController,在每个单元格里面是一个播放按钮和一个暂停按钮,以便播放音乐。当你按下播放按钮时,它应该播放特定于该单元格的音乐,但当我运行代码时,它播放随机音频,而不是我专门为它加载的音频。当我滚动tableview时,音频停止播放。为什么会出现这种情况,我该如何解决它?我还希望如果按下不同单元格中的播放按钮,它可以切换歌曲。
以下是我用来加载唯一字符串(由post.mp3
产生)以查找url文件到我的AVPlayer的函数:
func loadAudio(post: CompPost, completion: @escaping (URL) -> ())
{
let audioRef = Storage.storage().reference().child("cPosts").child(post.uid).child("Audio").child(post.mp3)
audioRef.downloadURL
{ (url, error) in
print("mp3filename: " + post.mp3)
guard error == nil else
{
print(error!.localizedDescription)
return /**alert**/
}
self.audioPlayer = AVPlayer(playerItem: AVPlayerItem(url: url!))
completion(url!)
}
}
下面是为每个单元加载唯一url的代码:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "cPostCell", for: indexPath) as! cPostCell
cell.delegate = self
cell.index = indexPath
//other code omitted for brevity
loadAudio(post: compPosts[indexPath.row])
{ (url) in
print("THIS IS THE URL")
print(url)
}
return cell
}
播放键功能:
func playMusic(index: Int)
{
audioPlayer.play()
isPlaying = true
print("playing now")
}
问题是,当你触发audioPlayer.play()
时,你没有将新的AVPlayerItem
加载到你的AVPlayer
中,因此,当你点击播放按钮时,玩家开始播放在你最后加载的tableViewCell
中加载的项目。尝试将所有playerItems保存到带有索引的数组中,当用户点击带有索引的按钮时,您将加载音频,并在加载时将新的AVPlayerItem
分配给AVPlayer
:
audioPlayer = AVPlayer(playerItem: yourPlayerItemArray[index]))
之后触发audioPlayer.play()