Следующая песня в MediaItemCollection?

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

У меня есть 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/очереди, чтобы он был в этом UILabel - так что это предварительный просмотр того, что будет следующей песней.

Любая помощь будет высоко оценена, спасибо! :)


person WunDaii    schedule 19.05.2014    source источник
comment
Если вы отследите MPMediaItemCollection, вы сможете использовать [musicPlayer indexOfNowPlayingItem], чтобы узнать, какой из них следующий.   -  person Larme    schedule 19.05.2014
comment
Как мне это использовать? Я пробовал несколько вещей, и я не уверен, что использую это правильно: S   -  person WunDaii    schedule 19.05.2014
comment
Сохраните [songsQuery items], это NSArray. Следующая музыка должна быть: MPMediaItem *nextItem = [musicPlayer indexOfNowPlayingItem]+1;. Ну, я не пробовал, и вам, возможно, придется проверить, существует ли этот индекс (я имею в виду, если ваш nowPlayingItem уже является последним и т. д., чтобы избежать ошибки выхода за пределы)   -  person Larme    schedule 19.05.2014
comment
Да, я получаю две ошибки: 1) Несовместимое преобразование целого числа в указатель при инициализации 'MPMediaItem *__strong' с выражением типа 'unsigned long и 2) Неявное преобразование 'unsigned long' в ' MPMediaItem *' запрещен с ARC   -  person WunDaii    schedule 19.05.2014
comment
Не могли бы вы показать, что именно вы пробовали?   -  person Larme    schedule 19.05.2014
comment
Я попробовал то, что вы предложили :) - MPMediaItem *nextItem = [musicPlayer indexOfNowPlayingItem]+1;   -  person WunDaii    schedule 19.05.2014
comment
давайте продолжим это обсуждение в чате   -  person Larme    schedule 19.05.2014
comment
Виноват. nextItem = [[songsQuery items] objectAtIndex:[musicPlayer indexOfNowPlayingItem]+1];   -  person Larme    schedule 19.05.2014
comment
Спасибо, но у меня есть небольшая проблема, которую я хотел бы обсудить в чате, если вы свободны, пожалуйста? Это связано с этим вопросом :)   -  person WunDaii    schedule 19.05.2014


Ответы (2)


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

@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 может быть первым элементом, а предыдущий элемент последним.

person Larme    schedule 19.05.2014

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

[musicPlayer skipToNextItem];

[musicPlayer skipToPreviousItem];
person Luke Schoen    schedule 06.07.2014