nowPlayingItem 在播放列表中的位置/向 MPMediaItem 添加类别

Posted

技术标签:

【中文标题】nowPlayingItem 在播放列表中的位置/向 MPMediaItem 添加类别【英文标题】:Position of nowPlayingItem in a playlist/Adding categories to MPMediaItem 【发布时间】:2010-09-17 19:43:29 【问题描述】:

我正在尝试找出 MPMusicPlayerController 的 nowPlayingItem 在其播放列表中的曲目编号。这将非常简单,除了同一首歌可以在同一个播放列表中出现多次(因为它们都指向同一个文件)。例如,如果一个播放列表由 Song 1、Song 2、Song 1、Song 3、Song 2 组成,我会纠结于如何确定 nowPlayingItem 是播放列表中的第一个项目还是第三个项目。

我解决问题最接近的方法是为 MPMediaItem 创建一个类别,该类别添加一个关联对象(一个 NSNumber),其中包含一个“播放列表中的数字”值和一个为 MPMusicPlayerController 设置该值的类别将播放列表添加到队列之前。

MPMediaItem+playlistNumber.h

#import <Foundation/Foundation.h>
#import <MediaPlayer/MediaPlayer.h>
#import <objc/runtime.h>
@interface MPMediaItem (playlistNumber)
-(NSNumber*)numberInPlaylist;
-(void)setNumberInPlaylist:(NSNumber *)number;
@end

MPMediaItem+playlistNumber.m

@implementation MPMediaItem (playlistNumber)
static NSString * numberInPlaylistKey;
-(NSNumber*)numberInPlaylist
    return objc_getAssociatedObject(self, &numberInPlaylistKey);

-(void)setNumberInPlaylist:(NSNumber *)number
    objc_setAssociatedObject(self, &numberInPlaylistKey, number, OBJC_ASSOCIATION_RETAIN);


@end

MPMusicPlayerController+NumberTracks.h

#import <Foundation/Foundation.h>
#import "MPMediaItem+PlaylistNumber.h"
#include <objc/runtime.h>
@interface MPMusicPlayerController (NumberTracks)

-(void)setQueueAndAddNumbersToItemCollection:(MPMediaItemCollection*)collection;
@end

MPMusicPlayerController+NumberTracks.m

#import "MPMusicPlayerController+NumberTracks.h"
@implementation MPMusicPlayerController (NumberTracks)
-(void)setQueueAndAddNumbersToItemCollection:(MPMediaItemCollection*)collection
    /*
    NSEnumerator *enumerator = [[collection items] objectEnumerator];
    MPMediaItem * object;
    int numberInPlaylist = 1;
    while (object = [enumerator nextObject]) 
        NSNumber * number = [[NSNumber alloc] initWithInt:numberInPlaylist];
        [object setNumberInPlaylist:number];
        NSLog(@"%@", [object numberInPlaylist]);
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] numberInPlaylist]);
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] valueForProperty:MPMediaItemPropertyTitle]);
        numberInPlaylist++;
    
    */
    /*
    for (int numberInPlaylist = 1; numberInPlaylist <= collection.count; numberInPlaylist++) 
        NSNumber * number = [[NSNumber alloc] initWithInt:numberInPlaylist];
        [[[collection items] objectAtIndex:numberInPlaylist-1] setNumberInPlaylist:number];
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] numberInPlaylist]);
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] valueForProperty:MPMediaItemPropertyTitle]);
        [number release];
    
    */
    NSArray * items = [collection items];
    NSUInteger number = 1;
    for (MPMediaItem * item in items) 
        [item setNumberInPlaylist:[NSNumber numberWithInt: number++]];
        NSLog(@"%@", item.numberInPlaylist);

    
    [self setQueueWithItemCollection:collection];
    [self play];
    [self pause];
    [self skipToBeginning];
    //The play/pause/skipToBeginnng is so that the nowPlayingItem is actually the first item in the queue

@end

在 NumberTracks 类别实现中,我尝试了 3 种不同的方式(两个大的注释部分和一个大的未注释部分)来实现 numberInPlaylist“属性”的分配。但是,当我尝试获取 nowPlayingItem MPMediaItem 时,numberInPlaylist 值始终返回 (null)。 实际上有可能实现我想要做的事情吗?在这一点上,我慢慢失去了它可以做到的信心。

【问题讨论】:

【参考方案1】:

在 MPMusicPlayerController 中有一个名为 indexOfNowPlayingItem 的隐藏属性。不幸的是,我不能使用它,因为 Apple 会拒绝我的应用程序使用私有财产/方法。

【讨论】:

indexOfNowPlayingItem 不是隐藏属性,它是 Apple 文档的一部分。请参阅MPMusicPlayerController Class Reference 的属性部分 为澄清起见,indexOfNowPlayingItem 在本文发布时可能是隐藏的,但它在 ios 5 SDK 中可用 这个答案是救星。

以上是关于nowPlayingItem 在播放列表中的位置/向 MPMediaItem 添加类别的主要内容,如果未能解决你的问题,请参考以下文章

确定第三方应用程序正在 iPhone 上播放的歌曲

iOS10.3.x 无法在 MPMusicPlayer 上为 Apple Music 曲目设置播放项目

Swift3 中的 imageWithSize

怎么查找python列表中元素的位置

如何在适当的位置反转列表中的子列表?

在 PySpotify 中,试图在不知道曲目在播放列表中的位置的情况下从播放列表中删除曲目