首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPMusicPlayerController队列问题

MPMusicPlayerController队列问题
EN

Stack Overflow用户
提问于 2012-06-04 03:32:43
回答 1查看 2.8K关注 0票数 1

我的MPMusicPlayerController出了点问题。这是一个iPodMusicPlayer,不是一个应用音乐播放器。我的问题是我不能让队列按正确的顺序播放。让我进一步解释一下:

我使用iPod选取器选择一个媒体收藏,然后将其添加到音乐播放器的队列中。完成此操作后,我将在表视图上显示集合中的项。然后,用户可以“玩”这个队列。然而,由于某些原因,当我尝试使用ipod控件浏览播放列表时,队列似乎排列不正确。下面是一些代码:

媒体选取器调用此方法:

代码语言:javascript
复制
-(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注销队列,它看起来是正确的。

从这里,用户可以单击播放按钮来播放队列。我是这样设置的:

代码语言:javascript
复制
-(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方法如下所示:

代码语言:javascript
复制
-(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,但注销不再为0的indexOfNowPlayingItem。当我尝试向前和向后跳转时,队列中的顺序不再保持。我不知道发生了什么

非常感谢您的帮助,很抱歉包含这么多代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-04 04:42:15

哇,出于某种原因,它的随机播放设置为开。这太尴尬了。这解决了所有问题:

代码语言:javascript
复制
    sharedMusicPlayer.musicPlayer.shuffleMode = MPMusicShuffleModeOff;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10873302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档