remoteControlReceivedWithEvent中的Nil值

时间:2014-02-26 01:33:21

标签: ios objective-c avaudioplayer avaudiosession uievent

我有一个主人详细信息的应用程序。点击tableViewMasterViewController的每个单元格导航到DetailViewController,您可以在其中下载并播放音频文件。我在保持AVAudioPlayer实例单一时遇到问题,因此多个单元格中的不同文件不会同时播放。在修复之前,我的remoteControlReceivedWithEvent工作正常,我可以管理所有视图控制器上的事件。

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

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

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

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

- (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

1 个答案:

答案 0 :(得分:1)

好的......问题终于解决了!这是我需要做的完全不同的事情。我只是使用错误的对象entry.audioManager。我原本应该使用currentAudioManager,这是extern类中声明的AudioManager。这将保留当前播放的文件,不会是零。