Ios 关于MPMediaItemCollection项lastObject
我在MPMediaItemsCollection中设置了N个项目,其中有些项目不是唯一的(该集合表示一个播放列表,同一首歌可能会出现两次) 在一个例子中,我用4首歌生成itemCollection,其中最后一首歌是第一首重复的歌。如果我尝试获取列表中的最后一个对象,\u musicPlayer将始终播放第一个项目 第一个NSLog打印“itemCollection count 4”,清楚地指示items数组中有四个项。但是,第二个NSLog打印“itemCollection lastObject index:0”,表示items.lastObject不返回对象和最后一个索引,而是返回出现相同媒体项的第一个索引 有人能解释一下吗 更正:如前所述,indexOfObject:不是返回重复对象索引的有效测试 但是,_musicPlayer.nowPlayingItem=[[itemCollection items]lastObject]将与lastObject相同的第一个实例设置为媒体播放器。似乎是NowPlayingItemSetter在itemCollection上调用IndexOfoObject:。变通办法 跟进Ios 关于MPMediaItemCollection项lastObject,ios,objective-c,cocoa-touch,nsarray,mpmediaitemcollection,Ios,Objective C,Cocoa Touch,Nsarray,Mpmediaitemcollection,我在MPMediaItemsCollection中设置了N个项目,其中有些项目不是唯一的(该集合表示一个播放列表,同一首歌可能会出现两次) 在一个例子中,我用4首歌生成itemCollection,其中最后一首歌是第一首重复的歌。如果我尝试获取列表中的最后一个对象,\u musicPlayer将始终播放第一个项目 第一个NSLog打印“itemCollection count 4”,清楚地指示items数组中有四个项。但是,第二个NSLog打印“itemCollection lastObject
似乎无法在MPMediaPlayer的队列中选择索引,并且setNowPlayingItem:调用IndexOfoObject:以查找所选的媒体项目。结果是,indexOfNowPlayingItem将返回与队列中nowPlayingItem相同的第一个实例的索引。在我的例子中,这会影响我应用程序中队列的视觉表示(它是一个滚动视图,每个歌曲都有一个面板)。MPMediaItemCollection可能不适用于MPMediaItems可以多次出现的播放列表。为了获得更多关于这个主题的信息,我将填写一份bug报告。这实际上与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;
}
如果您确实需要知道哪个索引应该与您在播放列表中使用的非唯一项相关联,那么您必须在首先检索媒体项时将其存储起来,从而自己跟踪该索引。是的,绝对可以。我只是注意到了错误。我要修改课文。尽管如此,_musicPlayer.nowPlayingItem=[[itemsCollection items]lastObject]也会将重复歌曲的第一个实例设置给播放器,也就是说,在我看来,nowPlayingItem有一个setter,在播放器的队列中调用IndexOfoObject:。所以我必须跟踪索引,这是绝对正确的。但是,我仍然找不到方法或属性来设置要在队列中播放的索引。有可能MPMediaItemCollection不是用来表示播放列表的。啊,我现在更明白你的问题了。我必须承认,尽管我对MediaPlayer框架有相当多的经验,但我还没有遇到过这种特殊情况。除非你找到另一个解决方案,否则向苹果提交一个bug是值得的,苹果请求一种方法来设置要播放的项目的索引。我想我会填写一份bug报告。谢谢你的帮助!
- (void)indexOfObject:(id)object
{
for (NSUInteger i=0; i<[self count]; i++) {
if ([self[i] isEqual:object]) return i;
}
return NSNotFound;
}
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)]