2010-09-17 1 views
1

J'essaie de comprendre le numéro de piste de nowPlayingItem de MPMusicPlayerController dans sa playlist. Ce serait super simple, sauf pour le fait que la même chanson peut apparaître plusieurs fois dans la même playlist (comme dans les deux pointent vers le même fichier). Par exemple, si une playlist est composée de Song 1, Song 2, Song 1, Song 3, Song 2, je suis bloqué sur la façon de déterminer si le nowPlayingItem est, disons, le premier ou le troisième élément de la playlist. La chose la plus proche que j'ai eu à résoudre le problème est de créer une catégorie pour MPMediaItem qui ajoute un objet associé (un NSNumber) contenant une valeur "number in playlist" et une catégorie pour MPMusicPlayerController qui définit cette valeur pour chaque MPMediaItem dans une playlist avant de l'ajouter à la file d'attente.Position de nowPlayingItem dans une playlist/Ajout de catégories à 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 

Dans la mise en œuvre de la catégorie NumberTracks, j'ai essayé 3 façons différentes (les deux grandes sections commentées et la grande section non commentée) d'implémenter l'affectation de la "propriété" numberInPlaylist. Toutefois, lorsque j'essaie d'obtenir le MPMediaItem nowPlayingItem, la valeur numberInPlaylist renvoie toujours (null). Est-il réellement possible de réaliser ce que j'essaie de faire? À ce stade, je perds lentement la foi que c'est possible.

Répondre

2

Il existe une propriété masquée appelée indexOfNowPlayingItem dans MPMusicPlayerController. Malheureusement, je ne peux pas l'utiliser car Apple rejettera mon application pour l'utilisation de la propriété privée/méthodes.

+3

indexOfNowPlayingItem n'est pas une propriété cachée, elle fait partie de la documentation d'Apple. Voir la section Propriétés de la [Référence de la classe MPMusicPlayerController] (http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMusicPlayerController_ClassReference/Reference/Reference.html) – MOK9

+2

pour plus de clarté, indexOfNowPlayingItem était probablement masqué à le temps de ce post, mais il est devenu disponible avec iOS 5 SDK – MOK9

+0

Cette réponse est un sauveur. –

Questions connexes