我有一个主人详细信息的应用程序。点击tableView
中MasterViewController
的每个单元格导航到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
?
答案 0 :(得分:1)
好的......问题终于解决了!这是我需要做的完全不同的事情。我只是使用错误的对象entry.audioManager
。我原本应该使用currentAudioManager
,这是extern
类中声明的AudioManager
。这将保留当前播放的文件,不会是零。