Проблемы с очередью MPMusicPlayerController
У меня возникли некоторые проблемы с моим MPMusicPlayerController. Это iPodMusicPlayer, а не appmusicplayer. Моя проблема в том, что я не могу заставить играть очередь в правильном порядке. Позвольте мне объяснить далее:
Я использую 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]);
}
При этом будет воспроизводиться правильная песня из indexpath таблицы, но по какой-то причине индекс больше не соответствует его местоположению в таблице. Если песня в индексе строки 0 имеет значение ABC, проигрыватель воспроизводит ABC, но выходит из системы indexOfNowPlayingItem, который больше не равен 0. Когда я пытаюсь перейти вперед и назад, порядок из очереди больше не поддерживается. Я понятия не имею, что происходит
Любая помощь с благодарностью, и извините, что включил так много кода
1 ответ
Вау по какой-то причине он был включен в случайном порядке. Это смущает. это исправило все:
sharedMusicPlayer.musicPlayer.shuffleMode = MPMusicShuffleModeOff;