MPMediaItemsCollection に N 個のアイテムを設定していますが、いくつかのアイテムは一意ではありません (コレクションはプレイリストを表し、同じ曲が 2 回表示される可能性があります)。
- (void)setLastSongWithItemCollection:(MPMediaItemCollection *)itemCollection
{
[_musicPlayer setQueueWithItemCollection: itemCollection];
NSLog(@"itemCollection count %u", itemCollection.count);
NSLog(@"itemCollection lastObject index: %u", [itemCollection.items indexOfObject:itemCollection.items.lastObject]);
_musicPlayer.nowPlayingItem = [[itemCollection items] lastObject];
}
1 つの例では、4 つの曲を含む itemCollection を生成しています。最後の曲は最初の曲が繰り返されます。リストの最後のオブジェクトを取得しようとすると、_musicPlayer は常に最初の項目を再生します。
最初の NSLog は、アイテム配列に 4 つのアイテムがあることを明確に示す "itemCollection count 4" を出力します。ただし、2 番目の NSLog は「itemCollection lastObject index:0」を出力します。これは、items.lastObject がオブジェクトと最後のインデックスを返すのではなく、同じメディア アイテムが発生する最初のインデックスを返すことを示しています。
誰でもこれに光を当てることができますか?
訂正: ご指摘のとおり、indexOfObject: は繰り返されるオブジェクトのインデックスを返すための有効なテストではありません
それでも、_musicPlayer.nowPlayingItem = [[itemCollection items] lastObject] は、lastObject と同一の最初のインスタンスをメディア プレーヤーに設定します。itemCollection で indexOfObject: を呼び出す nowPlayingItem セッターのようです。回避策?
ファローアップ
MPMediaPlayer のキューでインデックスを選択する方法はないようです。setNowPlayingItem:はindexOfObject:を呼び出します。選択されたメディア アイテムを検索します。その結果、indexOfNowPlayingItemは、キュー内の nowPlayingItem と同一の最初のインスタンスのインデックスを返します。私の場合、これはアプリにあるキューの視覚的表現に影響します (各曲のパネルを備えたスクロールビューです)。MPMediaItemCollection は、MPMediaItems が複数回出現するプレイリストでの使用を意図していなかった可能性があります。この件に関するより多くの情報を得るために、バグレポートに記入します。