2010-09-17 15 views
1

我試圖找出播放列表中MPMusicPlayerController的nowPlayingItem的曲目號。這很簡單,除了相同的歌曲可以在同一個播放列表中多次出現(就像它們都指向相同的文件一樣)。例如,如果由歌曲1,歌曲2,歌曲1,歌曲3,歌曲2組成的播放列表,我堅持如何確定nowPlayingItem是否是播放列表中的第一個或第三個項目。nowPlayingItem在播放列表中的位置/將類別添加到MPMediaItem

我已經得到了解決該問題創造MPMediaItem類別,增加了相關的對象包含「號在播放列表」值和MPMusicPlayerController類別(一個NSNumber),設置該值對每個MPMediaItem最接近的事在播放列表中添加到隊列中之前。

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「property」賦值的不同方法(兩個大型註釋部分和一個大型未註釋部分)。但是,當我嘗試獲取nowPlayingItem MPMediaItem時,numberInPlaylist值總是返回(null)。 實際上有可能實現我想要做的事情嗎?在這一點上,我正在慢慢失去信心。

回答

2

MPMusicPlayerController中有一個名爲indexOfNowPlayingItem的隱藏屬性。不幸的是,我無法使用它,因爲Apple會拒絕我的應用程序使用私有財產/方法。

+3

indexOfNowPlayingItem不是隱藏屬性,它是Apple文檔的一部分。請參閱[MPMusicPlayerController類參考](http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMusicPlayerController_ClassReference/Reference/Reference.html) – MOK9 2012-03-24 23:56:43

+2

的屬性部分來澄清,indexOfNowPlayingItem可能隱藏在這篇文章的時間,但它是成爲可用與iOS 5 SDK – MOK9 2012-03-25 00:12:35

+0

這個答案是一個救星。 – 2014-10-15 17:30:52

相關問題