1

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 が複数回出現するプレイリストでの使用を意図していなかった可能性があります。この件に関するより多くの情報を得るために、バグレポートに記入します。

4

1 に答える 1

2

これは、特に MPMediaItemsCollection とは何の関係もありません。むしろ、それは単に NSArray の動作です。

状態のドキュメントとして、-[NSArray indexOfObject:]「対応する配列値が特定のオブジェクトに等しい最小のインデックスを返します」。この場合、各オブジェクトに-isEqual:メッセージを送信することによって同等性が判断されます。

したがって、配列がある場合:

NSArray *array = @[@"A", @"B", @"C", @"A"];

次のように表示されます。

[array indexOfObject:@"A"] // returns 0
[array indexOfObject:array[3]] // also returns 0
[array indexOfObject:[array lastObject]] // also returns 0

基本的に、-[NSArray indexOfObject]次のようになります。

- (void)indexOfObject:(id)object
{
    for (NSUInteger i=0; i<[self count]; i++) {
        if ([self[i] isEqual:object]) return i;
    }
    return NSNotFound;
}

配列内の一致するすべてのオブジェクトのインデックスを知りたい場合は、次を使用します-[NSArray indexesOfObjectsPassingTest:]

NSArray *array = @[@"A", @"B", @"C", @"A"];
NSIndexSet *indexes = [array indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return [obj isEqual:@"A"];
}];
NSLog(@"Indexes: %@", indexes);

>>Indexes: <NSIndexSet: 0x7fbc9b40b170>[number of indexes: 2 (in 2 ranges), indexes: (0 3)]

プレイリスト内の一意でないアイテムの使用に関連付ける必要があるインデックスを本当に知る必要がある場合は、最初にメディア アイテムを取得するときにそれを保存して、それを自分で追跡する必要があります。

于 2013-01-25T19:10:27.843 に答える