2012-06-03 61 views
1

我遇到了一些与我的MPMusicPlayerController有关的问题。这是一个iPodMusicPlayer,而不是一个appmusicplayer。我的问题是我无法让队列按照正确的顺序播放。让我进一步解释:MPMusicPlayerController队列问题

我使用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]); 
} 

这起从实现代码如下indexpath正确的歌曲,但由于某种原因,索引不再与表中的位置匹配。如果行索引0中的歌曲是ABC,则播放器将播放ABC,但会注销不再为0的indexOfNowPlayingItem。当我尝试跳过前进和后退时,不再保留队列中的顺序。我不知道什么在

任何帮助非常感谢,并遗憾要包括这么多的代码

回答

5

哇由于某种原因,它已经洗牌设置为开。这是尴尬。这固定一切:

sharedMusicPlayer.musicPlayer.shuffleMode = MPMusicShuffleModeOff; 
+0

哇。感谢您通过不删除此问题来结束我的两小时头痛。 –