1

我有一个主从应用程序。点击导航中的tableView每个单元格,您可以下载和播放音频文件。我在保持实例单一时遇到了问题,因此来自多个单元的不同文件不会同时播放。在修复它之前,我的工作正常,我可以管理所有视图控制器上的事件。MasterViewControllerDetailViewControllerAVAudioPlayerremoteControlReceivedWithEvent

现在解决这个问题,我的播放器同时只播放一个文件,所以如果我碰巧导航回MasterViewController然后选择另一行并输入不同的单元格并开始播放,它将停止第一个文件并开始第二个文件. 但目前的问题是,当用户在其他地方时尝试使用控制中心,在 , 之外的地方DetailViewControllerremoteControlReceivedWithEvent调用,但值为nil,所以什么也没有发生。此时我可以检测到我现在正在播放哪一行,cellForRowAtIndexPath:并在下面突出显示它MasterViewController

if (entry.audioManager && [entry.audioManager soundPlayer].isPlaying)
{
    equalizer.hidden = NO;
    [self animateTheEqualizer];
}

但是我无法发现这一点,remoteControlReceivedWithEvent因为我无法访问索引。

我已经包含canBecomeFirstResponder等等,我确信这只是table view理解当前正在播放哪个文件的混乱。如果我在另一个 VC 中尝试这个DetailViewController但不在它之外,甚至在后台尝试,一切都很好。

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    //if it is a remote control event handle it correctly
    if (event.type == UIEventTypeRemoteControl)
    {
        if (event.subtype == UIEventSubtypeRemoteControlPlay)
        {
            [entry.audioManager playAudio];
//            [[NIKDetailViewController sharedController].feedEntry.audioManager playAudio];

        }
        else if (event.subtype == UIEventSubtypeRemoteControlPause)
        {
            [entry.audioManager pauseAudio];
        }
        else if (event.subtype == UIEventSubtypeRemoteControlTogglePlayPause)
        {
            [entry.audioManager togglePlayPause];
        }
        else if (event.subtype == UIEventSubtypeRemoteControlBeginSeekingBackward)
        {
            [entry.audioManager rewindTheAudio];
        }
        else if (event.subtype == UIEventSubtypeRemoteControlBeginSeekingForward)
        {
            [entry.audioManager fastForwardTheAudio];
        }
    }
}

在我的AudioManager课堂上:

- (void)playAudio
{
    //Play the audio and set the button to represent the audio is playing
    if ([soundPlayer isPlaying])
    {
        [soundPlayer pause];
        [self deleteTimer];
    }
    else
    {
        [self createTimer];
        [soundPlayer play];
    }

    [self refreshButton];
//  [[NIKMasterViewController sharedController] markEntryAsPlaying:detailViewController.feedEntry];
}

- (void)pauseAudio
{
    //Pause the audio and set the button to represent the audio is paused
    [soundPlayer pause];
    [self deleteTimer];
    [self refreshButton];
}

我应该markAsNowPlaying手动还是有一个委托方法可以用来发现正确的索引并避免获取nil

4

1 回答 1

1

好的...问题终于解决了!这是我需要做的完全不同的事情。我只是使用了错误的对象entry.audioManager。我应该使用currentAudioManager哪个是extern在课堂上声明的AudioManager。这将保留当前播放的文件并且不会为零。

于 2014-03-08T21:33:24.420 回答