2014-05-19 7 views
0

Как узнать название следующего элемента, который будет воспроизводиться в коллекции MPMediaItem? Я бы предпочел сохранить это как MPMediaItem.Следующая песня в MediaItemCollection?

У меня есть songsViewController, который содержит tableView всех композиций. Это мой код для didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MPMediaItem *selectedItem; 

    selectedItem = [[songs objectAtIndex:indexPath.row] representativeItem]; 

    MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer]; 

    [musicPlayer setQueueWithItemCollection:[MPMediaItemCollection collectionWithItems:[songsQuery items]]]; 

    [musicPlayer setNowPlayingItem:selectedItem]; 

    nowPlayingViewController *nowPlaying = [[rightSideMenuViewController alloc] 
              initWithNibName:@"nowPlayingViewController" bundle:nil]; 

    [self presentViewController:nowPlaying animated:YES completion:nil]; 

    [musicPlayer play]; 

} 

У меня есть UILabel на моем nowPlayingViewController, который выскакивает, когда пользователь выбрал песню. Я хотел бы сохранить заголовок следующего элемента в MediaItemCollection/queue, чтобы быть в этом UILabel - так что это предварительный просмотр того, что следующая песня.

Любая помощь будет очень признательна, спасибо! :)

+0

Если вы держите след 'MPMediaItemCollection' вы можете использовать' [MusicPlayer indexOfNowPlayingItem] ', чтобы знать, какие один из них следующий. – Larme

+0

Как это использовать? Я пробовал несколько вещей, и я не уверен, что правильно их использую: S – user3127576

+0

Сохранить '[songsQuery items]', это 'NSArray'. Следующая музыка должна быть: 'MPMediaItem * nextItem = [musicPlayer indexOfNowPlayingItem] +1;'. Ну, я не пытался, и вам, возможно, придется проверить, существует ли этот индекс (я имею в виду, если ваш nowPlayingItem уже является последним и т. Д., Чтобы избежать ошибки, связанной с ошибкой) – Larme

ответ

1

Сохраните свой список (так как у вас нет доступа в очередь музыкального проигрывателя).

@property (nonatomic, strong) NSArray *playlist; 

Когда вы делаете:

[musicPlayer setQueueWithItemCollection:[MPMediaItemCollection collectionWithItems:[songsQuery items]]]; 

Добавить:

playlist = [songsQuery items]; 

Чтобы забрать свой предыдущий/следующий:

-(MPMediaItem *)nextItem 
{ 
    int currentIndex = [musicPlayer indexOfNowPlayingItem]; 
    MPMediaItem *nextItem = [playlist objectAtIndex:currentIndex+1]; 
    return nextItem 
} 

-(MPMediaItem *)previousItem 
{ 
    int currentIndex = [musicPlayer indexOfNowPlayingItem]; 
    MPMediaItem *previousItem = [playlist objectAtIndex:currentIndex-1]; 
    return previousItem; 
} 

Важное примечание:
Я не проверял, был ли текущий элемент первым/последним (в соответствии с вашим предыдущим/последующим) элементом в playlist. Так что будьте осторожны с пределами NSArray, или вы получите:

NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index Z beyond bounds [X .. Y] 

Так же previousItem «существует»? Есть ли nextItem "существует"?

Вы можете также посмотреть на:

@property (nonatomic) MPMusicRepeatMode repeatMode 

В случае, nextItem может быть первым элементом, или предыдущий элемент последний.

0

MPMusicPlayerController предоставляет следующие методы экземпляра, чтобы быстро перейти к следующей или предыдущей песне:

[musicPlayer skipToNextItem]; 

[musicPlayer skipToPreviousItem];