remoteControlReceivedWithEvent不在单例类中调用

时间:2011-10-25 05:49:08

标签: ios multitasking remote-control

在我的应用程序中,我想像iPod音乐库一样实现音乐播放,可以播放背景和遥控器。

我的应用程序是:主页面中包含多个项目的表格视图,选择将进入音乐视图的音乐项目并显示用户下载的音乐。然后在此页面中,用户可以选择要播放的歌曲。

我在单身中创建一个自定义的Player类,这样音乐仍然可以播放音乐视图页面中的事件。现在我的问题是如何实现远程控制。我使用Apple guide尝试了这种方式。当应用程序位于音乐视图页面然后进入后台时,它确实有效。

但是,如果应用程序位于另一页并且正在播放音乐,则遥控器将失败并且无法呼叫任何内容。

我的代码是这样的:


[self.navigationController pushViewController:musicViewController animated:YES];

The MusicViewController has a singleton player, which is like:

@interface FWAudioPlayer : UIViewController// I also tried to subclass of UIResponder, and it didn't work either { NSUInteger currectIndex; NSMutableArray *_urlArray; NSMutableArray *randomArray; AVAudioPlayer *_player; id fwDelegate; } @property (nonatomic, retain) NSMutableArray *urlArray; @property (nonatomic, retain) NSMutableArray *randomArray; @property (nonatomic, retain) AVAudioPlayer *audioPlayer; @property (nonatomic, assign) id fwDelegate; @property (nonatomic, assign) NSUInteger currectIndex; @property (nonatomic, assign) BOOL shuffle; + (id)sharedAudioPlayerWithData:(NSData *)data error:(NSError **)error; + (id)sharedAudioPlayer; @end

When app is leaving the music view page, I did sth here

- (void)viewWillDisappear:(BOOL)animated { FWAudioPlayer *fwaudioPlayer = [FWAudioPlayer sharedAudioPlayer]; [fwaudioPlayer becomeFirstResponder]; }

顺便说一句,我已经设置了AppDelegate:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

现在,当应用程序离开音乐视图页面时,我发现[FWAudioPlayer canBecomeFirstResponder]已被调用。然后我单击遥控器,永远不会调用[FWAudioPlayer remoteControlReceivedWithEvent:]。 然后我尝试在AppDelegate中接收远程控制事件。如果它可以在AppDelegate中接收事件,我可以调度事件处理并调用单例类。但是,似乎永远不会在AppDelegate中调用它。

所以我想知道这里有什么问题。我猜是单例类FWAudioPlayer不是真正的UIViewController,因为它不在应用程序的视图层次结构之下。此外,当应用程序离开其他页面(如主页面)时,MainViewController是第一个响应者,而FWAudioPlayer永远无法获取远程事件。

如果我是对的,我怎样才能实现具有与iPod音乐相同功能的音乐播放器,特别是具有后台播放和遥控功能?

如果我猜错了,如何让它(单例类)接收远程事件?

谢谢!

2 个答案:

答案 0 :(得分:4)

我遵循此answer。 我将UIWindow子类化并自己发送事件。 但我仍然想知道为什么单例类无法接收遥控器。

如果有人告诉我,我会选择那个答案。

我在Apple的事件处理中找到答案,它清楚地描述了响应者。

答案 1 :(得分:1)

确保它是否可以成为第一响应者

(BOOL)canBecomeFirstResponder {
    return YES;
}