我在MPMediaItemsCollection中设置了N个条目,其中有些项不是唯一的(集合表示一个播放列表,其中同一首歌可能出现两次)。
- (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];
}在一个例子中,我用4首歌生成itemCollection,最后一首歌是第一首重复的。如果我试图获取列表中的最后一个对象,_musicPlayer将始终播放第一个项。
第一个NSLog打印"itemCollection计数4“,清楚地指示项数组中有四个项。但是,第二个NSLog打印"itemCollection lastObject index:0",指示items.lastObject不返回对象和最后一个索引,而是返回发生相同媒体项的第一个索引。
有人能解释一下这件事吗?
更正:正如指出的那样,indexOfObject:不是返回重复对象索引的有效测试
不过,_musicPlayer.nowPlayingItem = [itemCollection items lastObject]将第一个实例设置为与lastObject相同的媒体播放器。似乎是nowPlayingItem设置器调用了indexOfObject: on itemCollection。解决办法?
后续
似乎没有办法在一个setNowPlayingItem:的队列中选择一个索引,并且indexOfObject:调用indexOfObject:来查找所选的媒体项。结果是,indexOfNowPlayingItem将返回与队列中的nowPlayingItem相同的第一个实例的索引。在我的例子中,这会影响我在应用程序中的队列的可视化表示(这是一个滚动视图,每首歌都有一个面板)。MPMediaItemCollection可能不是用于MPMediaItems可以多次出现的播放列表。为了获得更多关于这个问题的信息,我将填写一份错误报告。
发布于 2013-01-25 19:10:27
具体而言,这与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)]如果您真的需要知道哪个索引应该与您在播放列表中使用的非唯一项相关联,那么您首先必须在检索媒体项时通过存储它来跟踪它。
https://stackoverflow.com/questions/14528268
复制相似问题