gpt4 book ai didi

ios - 选择不同项目时播放队列中的第一项

转载 作者:行者123 更新时间:2023-11-29 05:20:03 27 4
gpt4 key购买 nike

我在使用媒体播放器框架和 UICollectionView 时遇到了问题。

这一切都是从 didSelectItemAt UICollectionViewDelegate 方法调用我的函数 setPlayerQueue(with storeIds: [String], start index: Int) (见下文)开始的。这预计会按照与 UICollectionView 中轨道显示相匹配的顺序将商店 id 排入队列。因此,如果点击单元格 15,则应播放轨道 15。实际发生的情况是,轨道 1 首先播放,如果我再次点击,轨道 15 将按预期播放。

当我点击 UICollectionView 中的单元格时,会通过 func setQueue(with descriptor: MPMusicPlayerQueueDescriptor) 使用商店 id 数组创建一个队列。 .在调用 setQueue(descriptor) 之前,我还将 MPMusicPlayerQueueDescriptor startItemID 属性分配给与所选索引路径关联的商店 ID。

func setPlayerQueue(with storeIds: [String], start index: Int) {

let descriptor: MPMusicPlayerStoreQueueDescriptor = MPMusicPlayerStoreQueueDescriptor(storeIDs: storeIds)

descriptor.startItemID = storeIds[index]

player.setQueue(with: descriptor) // player: MPMusicPlayerController.applicationMusicPlayer
}

重现:

  1. 创建商店 ID 数组(例如 20 个轨道)
  2. 滚动到 UICollectionView 底部(例如 20 个项目)
  3. 通过选择任意单元格(例如索引 17)调用 setPlayerQueue(with: storeIds, start: indexPath.item)
  4. 调用 prepareToPlay() { e:错误?在 } 中,然后是闭包中的 play()

我希望播放第 17 首轨道,但实际播放的是第 1 首轨道。如果我再次点击同一个单元格 17,轨道 17 将按预期播放。

我已经搜索过互联网和文档,但无济于事。任何帮助将不胜感激。

我已提交 bug report以防万一,与苹果公司联系。

最佳答案

如果其他人遇到同样的问题,我已经找到了解决方法并有一些见解可以分享。

解决方法

MPMusicPlayerControllerNowPlayingItemDidChange 通知的选择器方法中,添加一些逻辑以将当前项目与预期项目进行比较。如果项目不匹配,请重新设置队列。

示例代码:


...

// Register observer for MPMusicPlayerControllerNowPlayingItemDidChange
NotificationCenter.default.addObserver(self,
selector: #selector(self.playbackItemDidChange),
name: .MPMusicPlayerControllerNowPlayingItemDidChange,
object: player)

...

// Your selector method
@objc func playbackItemDidChange(_ sender: NSNotification) {

// Store identifier of item currently playing
let nowPlayingItem = player.nowPlayingItem // unwrap optional
let currentItemStoreId = nowPlayingItem.playbackStoreId

// Store identifier of item that should play first
// `descriptor` is an MPMusicPlayerStoreQueueDescriptor object
let expectedItemId = self.descriptor.startItemId

// Compare
if currentItemStoreId != expectedItemId {

// An `MPModelObjectMediaItem` appears first and its store id is empty.
// I'm ignoring the MPModelObjectMediaItem here
if (currentItemStoreId != "") {

// The wrong item is playing.
// Set your queue once again and playback should commence from the correct item.

}

}

}

注意事项:

  • 确保在重新设置队列之前在播放器上调用 stop()
  • 您需要额外的逻辑来允许手动更改项目(例如“跳过”和“后退”操作),因为解决方法会阻止这些操作。

观察结果

我最初怀疑 UICollectionView 有问题,因为该错误仅在我滚动时出现。然而,我发现问题实际上与队列大小有关。当我的队列有大约 10 个项目时,我首先点击的任何项目都会按预期播放。当我有 20 个项目时,我点击项目 17,则会播放项目 1。如果我第二次点击项目 17,它就会按预期播放。

这很可能是一个错误。 Apple 尚未回复我,但与此同时,我的解决方法起到了作用。

关于ios - 选择不同项目时播放队列中的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58758583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com