Я пытаюсь выяснить номер трека 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). Действительно ли можно добиться того, что я пытаюсь сделать? В этот момент я постепенно теряю веру, что это возможно.
indexOfNowPlayingItem не является скрытым свойством, он является частью документации Apple. См. Раздел «Свойства» в [Справочник классов MPMusicPlayerController] (http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMusicPlayerController_ClassReference/Reference/Reference.html) – MOK9
для уточнения, indexOfNowPlayingItem, вероятно, был скрыт в время этого сообщения, но оно стало доступно с iOS 5 SDK – MOK9
Этот ответ - спаситель. –