首页 文章

remoteControlReceivedWithEvent不在单例类中调用

提问于
浏览
3

在我的应用程序中,我想像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 回答

  • 4

    我按照这个answer . 我将UIWindow子类化并自己发送事件 . 但我仍然想知道为什么单例类无法接收遥控器 .

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

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

  • 1

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

    (BOOL)canBecomeFirstResponder {
        return YES;
    }
    

相关问题