2012-06-03 4 views
1

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

Я использую iPod picker для выбора медиа-коллекции, которую я затем добавляю в очередь музыкального проигрывателя. Как только я это сделаю, я отображу элементы в коллекции на виде таблицы. Пользователь может «воспроизвести» эту очередь. Однако по какой-то причине, когда я пытаюсь перейти через список воспроизведения с помощью элементов управления 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]); 
} 

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

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

ответ

5

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

sharedMusicPlayer.musicPlayer.shuffleMode = MPMusicShuffleModeOff; 
+0

Ничего себе. Спасибо, что закончили мою двухчасовую головную боль, не удалив этот вопрос. –

Смежные вопросы