ios - 在 iOS 中使用 MPMusicPlayerController 播放和跳过播放列表中的下一首歌曲

标签 ios cocoa-touch mpmusicplayercontroller

我在 NSArray 中有播放列表歌曲,并在我的 UITableView 中显示这些歌曲,如下图所示。

enter image description here

就我而言,当我从 UITableView 选择一首歌曲时,我想使用 MPMusicPlayerController's applicationMusicPlayer 播放该歌曲。

我的意思是,当我从 UITableView 中选择 american idiot 时,我想用 MPMusicPlayerController 的 玩 American idiot

当我点击下面的“跳过”按钮时,它必须播放下一首歌曲,例如郊区的耶稣。

这是我将歌曲加载到 UITableView 的代码

self.player = [MPMusicPlayerController applicationMusicPlayer];

    MPMediaQuery *query = [MPMediaQuery playlistsQuery];
    MPMediaPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:@"GreenDay" forProperty:MPMediaPlaylistPropertyName comparisonType:MPMediaPredicateComparisonContains];

    [query addFilterPredicate:predicate];

    self.arrayOfSongs = [query items];

我想你明白我的意思。 我想做所有音乐按钮的工作,就像 iOS 内置的音乐应用程序一样,当我从 UITableView 中选择歌曲时播放歌曲。

我正在尝试任何方法,但我没有找到可以解决我的问题的解决方案。

请帮助我这样做。

谢谢你。 :)

最佳答案

假设您的 NSArray 填充了 MPMediaItemCollection 中的 MPMediaItems,一旦您知道需要配置什么,这实际上相当简单。首先,创建一个iVar,最好是NSUInteger来存储当前播放轨道的索引。这对于按顺序从一个轨道转到另一轨道是必要的。

其次,很难从您的帖子中判断轨道标题是否是从集合中的媒体项目中读取的,或者它们只是静态放置在 table 上,但我提供了一个如何读取的示例数组中媒体项目的轨道标题,并使用 valueForProperty 将该值设置为单元格文本.

最后,didSelectRowAtIndexPath下面的配置演示了如何将已创建的无符号整数设置为所选单元格的值。两者didSelectRowAtIndexPath我创建的两个 IBAction 都修改此索引的值,然后调用我创建的 void“stopCurrentTrackAndPlaySelection”,它会停止当前播放的轨道,将 MPMediaItem 类型转换为该索引处的对象,然后再次开始播放。

如果您需要更多说明,请询问:)

旁注:我建议您将媒体选择器选择 (MPMediaItemCollection) 的副本存储在 NSMutableArray 中,而不是直接存储在 NSArray 或 MPMediaItemCollection 中。这将允许您动态添加或删除轨道,而无需停止播放。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [myArrayOfTracks count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [[cell textLabel] setText:[(MPMediaItem *)[myArrayOfTracks objectAtIndex:indexPath.row] valueForProperty:MPMediaItemPropertyTitle]];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    indexOfCurrentlyPlayingTrack = indexPath.row;
    [self stopCurrentTrackAndPlaySelection];
}

- (IBAction)nextTrack:(UIButton *)sender
{
    indexOfCurrentlyPlayingTrack ++;
    [self stopCurrentTrackAndPlaySelection];
}

- (IBAction)previousTrack:(UIButton *)sender
{
    indexOfCurrentlyPlayingTrack --;
    [self stopCurrentTrackAndPlaySelection];
}

- (void)stopCurrentTrackAndPlaySelection
{
    [myMPMusicPlayerController stop];
    [myMPMusicPlayerController setNowPlayingItem:(MPMediaItem *)[myArrayOfTracks objectAtIndex:indexOfCurrentlyPlayingTrack]];
    [myMPMusicPlayerController play];
}

关于ios - 在 iOS 中使用 MPMusicPlayerController 播放和跳过播放列表中的下一首歌曲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14259798/

相关文章:

ios - Swift 4 .plist 处理

ios - 在单元格中编辑 UITextView 时,iOS 7 中的 UITableView 不会滚动到正确的位置

iphone - UINavigationController 后退按钮位置

ios - UIAlertView subview 定位

ios - 有什么办法可以在后台获取 Apple Music 播放的通知吗?

ios - Apple Pay iOS Swift 申请优惠券

ios - 如果用户强制退出,iOS 是否会将我的应用程序启动到后台?

iphone - ASIHTTPRequest代码设计

iOS10.3.x 无法在 MPMusicPlayer 上为 Apple Music 轨道设置 nowPlayingItem

ios - 使用 MPVolume 为音乐播放器调整音量,iOS