Проблемы с очередью MPMusicPlayerController

У меня возникли проблемы с моим MPMusicPlayerController. Это iPodMusicPlayer, а не appmusicplayer. Моя проблема в том, что я не могу заставить очередь играть в правильном порядке. Поясню дальше:

Я использую средство выбора iPod для выбора коллекции мультимедиа, которую затем добавляю в очередь музыкального проигрывателя. Как только я это сделаю, я покажу элементы коллекции в виде таблицы. Затем пользователь может «воспроизвести» эту очередь. Однако по какой-то причине, когда я пытаюсь перемещаться по списку воспроизведения с помощью элементов управления iPod, очередь кажется неправильной. Вот код:

Средство выбора мультимедиа вызывает этот метод:

-(void)updatePlayerQueueWithMediaCollection:(MPMediaItemCollection *)collection {

if (collection) {

    // If there's no playback queue yet...

    if (self.userMediaItemCollection == nil) {
        [self setUserMediaItemCollection: collection];
        [self.musicPlayer setQueueWithItemCollection:self.userMediaItemCollection];
    } else {
        BOOL wasPlaying = NO;
        if (self.musicPlayer.playbackState == MPMusicPlaybackStatePlaying) {
            wasPlaying = YES;
        }

        // Save the now-playing item and its current playback time.

        MPMediaItem *nowPlayingItem        = self.musicPlayer.nowPlayingItem;
        NSTimeInterval currentPlaybackTime = self.musicPlayer.currentPlaybackTime;

        // Combine the previously-existing media item collection with the new one

        NSMutableArray *combinedMediaItems =
        [[self.userMediaItemCollection items] mutableCopy];
        NSArray *newMediaItems = [collection items];
        [combinedMediaItems addObjectsFromArray: newMediaItems];

        [self setUserMediaItemCollection:[MPMediaItemCollection collectionWithItems:(NSArray *) combinedMediaItems]];

        [self.musicPlayer setQueueWithItemCollection: self.userMediaItemCollection];

        // Restore the now-playing item and its current playback time.

        self.musicPlayer.nowPlayingItem      = nowPlayingItem;
        self.musicPlayer.currentPlaybackTime = currentPlaybackTime;

        if (wasPlaying) {
            [self.musicPlayer play];
        }
    }
}
int i = 0; 
for (MPMediaItem *item in [self.userMediaItemCollection items]){
    NSLog(@"playback queue item %i has title %@",i, [item valueForKey:MPMediaItemPropertyTitle] );
    i++;
}

}

достаточно просто, это взято непосредственно из яблока. Этот NSLog внизу выходит из очереди, и он выглядит правильно.

Отсюда пользователь может нажать кнопку воспроизведения, чтобы воспроизвести очередь. Я установил это так:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

if ([segue.destinationViewController respondsToSelector:@selector(setNowPlayingItem:)]) {
    NSArray *items = [[MusicPlayerManager sharedMusicPlayer].userMediaItemCollection items];
    [segue.destinationViewController performSelector:@selector(setNowPlayingItem:) withObject:[items objectAtIndex:indexPath.row]];
}

if ([segue.destinationViewController respondsToSelector:@selector(setTrackList:)]) {
    [segue.destinationViewController performSelector:@selector(setTrackList:) withObject:[MusicPlayerManager sharedMusicPlayer].userMediaItemCollection];
    NSLog(@"tracklist from tltbvc looks like %@", [MusicPlayerManager sharedMusicPlayer].userMediaItemCollection);
}

}

В целевом контроллере представления метод setNowPlayingItem выглядит следующим образом:

-(void) setNowPlayingItem:(MPMediaItem *)nowPlayingItem {
    _nowPlayingItem = nowPlayingItem;
    [MusicPlayerManager sharedMusicPlayer].musicPlayer.nowPlayingItem = nowPlayingItem;
    [[MusicPlayerManager sharedMusicPlayer].musicPlayer play];
    NSLog(@"index of now playing item %i", [[MusicPlayerManager sharedMusicPlayer].musicPlayer indexOfNowPlayingItem]);
}

Это воспроизводит правильную песню из пути к индексу таблицы, но по какой-то причине индекс больше не соответствует его местоположению в таблице. Если песня в строке с индексом 0 — это ABC, проигрыватель воспроизводит ABC, но выводит из системы indexOfNowPlayingItem, который больше не равен 0. Когда я пытаюсь пропустить вперед и назад, порядок в очереди больше не поддерживается. я понятия не имею, что происходит

Любая помощь очень ценится, и извините, что включил так много кода


person Sean Danzeiser    schedule 03.06.2012    source источник


Ответы (1)


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

    sharedMusicPlayer.musicPlayer.shuffleMode = MPMusicShuffleModeOff;
person Sean Danzeiser    schedule 03.06.2012
comment
Вот это да. Спасибо, что прекратили мою двухчасовую головную боль, не удалив этот вопрос. - person Mike A; 06.06.2013