ios - 关于 MPMediaItemCollection 项目 lastObject

标签 ios objective-c cocoa-touch nsarray mpmediaitemcollection

我在 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 count 4”,清楚地表明 items 数组中有四个项目。然而,第二个 NSLog 打印“itemCollection lastObject index:0”,表明 items.lastObject 不返回对象和最后一个索引,而是返回出现相同媒体项的第一个。

任何人都可以阐明这一点吗?

更正:如前所述,indexOfObject: 不是返回重复对象索引的有效测试

仍然,_musicPlayer.nowPlayingItem = [[itemCollection items] lastObject] 将与 lastObject 相同的第一个实例设置为媒体播放器。似乎 nowPlayingItem setter 在 itemCollection 上调用 indexOfObject:。解决方法?

跟进

似乎无法在 MPMediaPlayer 的队列中选择索引,setNowPlayingItem: 调用 indexOfObject: 来查找选定的媒体项。结果是 indexOfNowPlayingItem 将返回队列中与 nowPlayingItem 相同的第一个实例的索引。在我的例子中,这会影响我在我的应用程序中的队列的视觉表示(它是一个 ScrollView ,每首歌曲都有一个面板)。 MPMediaItemCollection 可能不适用于 MPMediaItems 可以多次出现的播放列表。为了获得有关该主题的更多信息,我将填写错误报告。

最佳答案

这确实与 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)]

如果您真的需要知道哪个索引应该与您对播放列表中非唯一项目的使用相关联,您必须自己跟踪它,方法是在您首先检索媒体项目时存储它.

关于ios - 关于 MPMediaItemCollection 项目 lastObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528268/

相关文章:

ios - NSArray作为核心数据fetchRequest中的参数

iphone - iOS - UUID 生成抛出一个奇怪的异常

ios - iOS8 中 iOS 模拟器和设备之间 NSNumber 到 BOOL 的不同结果

ios - 无法在 Swift 中使用协议(protocol)作为另一个协议(protocol)中的关联类型

ios - 自定义按钮 initWithImage 在自定义图像后面显示默认按钮

ios - iOS 8 UITableViewCell 上的 Springs 和 struts 调整大小损坏

objective-c - Objective-C 函数中的变量返回类型(使用 Cocoa)

iphone - 为什么 viewDidAppear 没有被触发?

ios - UIGesturerecognizer 不调用 shouldRecognizeSimultaneouslyWithGestureRecognizer

iphone - iOS - 允许用户从文档目录下载文件,但不允许使用 iTunes 上传文件