2010-09-17 4 views
1

Я пытаюсь выяснить номер трека MPMusicPlayerController's nowPlayingItem в своем плейлисте. Это было бы очень просто, за исключением того факта, что одна и та же песня может появляться несколько раз в одном и том же плейлисте (так как в обоих они указывают один и тот же файл). Например, если список воспроизведения состоял из песни 1, песни 2, песни 1, песни 3, песни 2, я застрял на том, как определить, является ли nowPlayingItem, скажем, первым или третьим элементом в списке воспроизведения.Позиция nowPlayingItem в плейлисте/Добавление категорий в MPMediaItem

Ближайшей задачей, которую я решил решить, является создание категории для MPMediaItem, которая добавляет связанный объект (NSNumber), содержащий значение «число в плейлисте» и категорию для MPMusicPlayerController, которая устанавливает это значение для каждого 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 разных способа (два больших раздела с комментариями и один большой раздел без комментирования) реализации присвоения свойства propertyInPlaylist. Однако, когда я пытаюсь получить файл 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

+2

для уточнения, indexOfNowPlayingItem, вероятно, был скрыт в время этого сообщения, но оно стало доступно с iOS 5 SDK – MOK9

+0

Этот ответ - спаситель. –