问题描述
我正在构建一个利用MPMusicPlayerApplicationController
播放用户本地音乐库中的音乐的应用。
从库中检索歌曲的方式如下:
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()
}
我还有一个段控件,它将确定是按照检索歌曲的顺序显示歌曲,还是按照最后播放的顺序显示歌曲;然后根据选择的选项更新表格视图:
var retrievedSongs: [MPMediaItem] = []
var sortedSongs: [MPMediaItem] = []
private func sortOrderDidChange() {
switch sortOrder {
case .playDateDescending:
let unixDate = Date(timeIntervalSince1970: 1000)
sortedSongs = retrievedSongs.sorted {
$0.lastPlayedDate ?? unixDate > $1.lastPlayedDate ?? unixDate
}
default:
sortedSongs = retrievedSongs
}
setTableViewItems(sortedSongs)
let queueDescriptor = MPMusicPlayerMediaItemQueueDescriptor(itemCollection: MPMediaItemCollection(items: sortedSongs))
queueDescriptor.startItem = musicPlayer.NowPlayingItem
musicPlayer.setQueue(with: queueDescriptor)
selectPlayingItem(scrollToVisible: true)
}
@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)
按检索顺序显示歌曲时,一切正常。如果我单击后退或前进,或选择要播放的歌曲;正确的歌曲将以下一个顺序播放。
现在,如果您位于“检索到的订单”标签中,然后转到“按日期排序”标签,然后向后或向前单击,则下一首歌曲将不再是表格视图中显示的下一首歌曲,而是按顺序“撤回”。
我想做的就是更改代码,以便无论显示检索到的还是订购的歌曲,下一首或上一首歌曲都将与显示的内容相对应。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)