尝试在 uitableview 中通过 AVPlayer 播放音乐,但播放的音乐错误(从 Firebase 加载错误的音乐)
Trying to play music through AVPlayer in a uitableview, but the wrong music is being played (wrong music is being loaded from Firebase)
所以我有一个 UITableViewController,每个单元格内都有一个播放按钮和一个暂停按钮,以便播放音乐。当您按下播放按钮时,它应该播放特定于该单元格的音乐,但是当我 运行 我的代码时,它会播放随机音频,而不是我专门为其加载的音频。此外,当我滚动浏览 tableview 时,音频停止播放。为什么会这样,我该如何解决?如果按下不同单元格中的播放按钮,我还希望它切换歌曲。
这是我用来加载唯一字符串(由 post.mp3
生成)以在我的 AVPlayer 中找到 url 文件的函数:
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()
所以我有一个 UITableViewController,每个单元格内都有一个播放按钮和一个暂停按钮,以便播放音乐。当您按下播放按钮时,它应该播放特定于该单元格的音乐,但是当我 运行 我的代码时,它会播放随机音频,而不是我专门为其加载的音频。此外,当我滚动浏览 tableview 时,音频停止播放。为什么会这样,我该如何解决?如果按下不同单元格中的播放按钮,我还希望它切换歌曲。
这是我用来加载唯一字符串(由 post.mp3
生成)以在我的 AVPlayer 中找到 url 文件的函数:
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()