Ios 按检索+上次播放的顺序显示和播放MPMediaItem歌曲
我正在开发一个应用程序,它利用MPMusicLayerApplicationController播放用户本地音乐库中的音乐 从库中检索的歌曲如下所示:Ios 按检索+上次播放的顺序显示和播放MPMediaItem歌曲,ios,swift,uitableview,mpmusicplayercontroller,Ios,Swift,Uitableview,Mpmusicplayercontroller,我正在开发一个应用程序,它利用MPMusicLayerApplicationController播放用户本地音乐库中的音乐 从库中检索的歌曲如下所示: func retrieveMusic() { mediaQueryQueue.async { let songsQuery = MPMediaQuery.songs() let songsCollections = songsQuery.collections for songCollect
func retrieveMusic() {
mediaQueryQueue.async {
let songsQuery = MPMediaQuery.songs()
let songsCollections = songsQuery.collections
for songCollection in songsCollections ?? [] {
let songs = songCollection.items
self.retrievedSongs.append(contentsOf: songs)
}
DispatchQueue.main.async {
self.setLoadedSongsUIState()
self.setupTableView()
self.sortOrderDidChange()
}
}
}
然后,这些歌曲将显示在表格视图中:
func setTableViewItems(_ songs: [MPMediaItem]) {
let section = self.tableViewAdaptor!.sections[0] as! TableViewAdaptorSection<SongTableViewCell, MPMediaItem>
section.items = songs
tableViewAdaptor.tableView.reloadData()
}
用户可以使用按钮播放/暂停,并转到下一个或上一个曲目:
@IBAction func forwardButtonPressed(_ sender: Any) {
musicPlayer.skipToNextItem()
selectPlayingItem(scrollToVisible: true)
}
@IBAction func backButtonPressed(_ sender: Any) {
musicPlayer.skipToPreviousItem()
selectPlayingItem(scrollToVisible: true)
}
此外,如果在表视图中选择一个曲目,则将播放该曲目:
tableViewAdaptor = TableViewAdaptor(
tableView: songTableView,
sections: [songsLibrarySection],
didChangeHandler: {
let selectedSongIndex = self.songTableView.indexPathForSelectedRow
if selectedSongIndex != nil {
let selectedSong = self.retrievedSongs[selectedSongIndex!.row]
self.musicPlayer.nowPlayingItem = selectedSong
self.musicPlayer.play()
self.updatePlaybackUI(scrollNowPlayingToVisible: true)
}
})
setTableViewItems(retrievedSongs)
当歌曲按检索顺序显示时,一切都能正常工作。如果我单击后退或前进,或选择要播放的歌曲;正确的歌曲将按下一顺序播放
现在,如果您在order retrieved选项卡中,转到ordered by date选项卡并单击Backward或forward,则下一首歌曲将不是表视图中显示的下一首歌曲,而是在retrieved by order中
我要做的是更改代码,以便无论是显示检索到的歌曲还是已排序的歌曲,下一首或上一首歌曲都将与显示的内容相对应。根据我的测试,在播放过程中更改项目的顺序可以正常工作。可能您的表视图在显示顺序不正确的歌曲时出现了一些UI问题。问题可能出现在以下句子中:“musicPlayer.setQueuewith:queueDescriptor”您是否尝试在再次设置musicPlayer队列之前清除该队列。如果您可以共享整个代码,那么检查我们所有人会更容易。@wazowski-hmm,也许吧!设置播放机队列的所有代码都在问题中,thoguh。@narner我在尝试将视频数组洗牌到AVPlayer中时遇到同样的问题,我必须重置整个播放机,以便将新的视频数组设置为以正确的方式排序。我没有找到解决方案,所以我决定使用RxSwift映射数组并尝试将其洗牌。这确实起到了作用,但代价是安装一个框架。
tableViewAdaptor = TableViewAdaptor(
tableView: songTableView,
sections: [songsLibrarySection],
didChangeHandler: {
let selectedSongIndex = self.songTableView.indexPathForSelectedRow
if selectedSongIndex != nil {
let selectedSong = self.retrievedSongs[selectedSongIndex!.row]
self.musicPlayer.nowPlayingItem = selectedSong
self.musicPlayer.play()
self.updatePlaybackUI(scrollNowPlayingToVisible: true)
}
})
setTableViewItems(retrievedSongs)