一. 问题
我们的项目需求是这样的:
- 课程有语音和视频两种类型,当前点播的课程,退出点播界面之后,也可以全局播放,下次再次进入点播界面,如果是同一个课程,定位到上次播放的地方,接着播放,如果不是同一课程,重新播放。
- 课程种类有系列课和单品课程,系列课程可以上一首和下一首,当前课程播放完毕之后,自动播放下一首。
- 语音课程进入后台,可以锁屏操作,视频课程进入后台,暂停播放,回到前台继续播放。
就类似音乐播放器。
我选用单例做了个全局的播放器。当点播如果是视频课程,在点播界面将播放器添加到点播界面的view,退出点播界面将播放器移除。
我将锁屏后,后台操作的远程控制事件,放在了播放器的view里面进行判断。
但是外部事件的函数确一直没有相应。
//重写父类方法,接受外部事件的处理
- (void)remoteControlReceivedWithEvent: (UIEvent *)receivedEvent
三. 分析 与 解决
原因:
虽然videoPlayerView
(播放器)成为了第一响应者,但是由于videoPlayerView
没有被添加到相应的父类中,隐藏响应链无法传递,导致了接收外部事件的函数没有响应。
解决方法:
因此在单例里,我在videoPlayerView
加载的时候将其添加到[UIApplication sharedApplication].keyWindow
上面。这样外部相应函数就会响应。
原因:
但由于视频点播界面时,需要将videoPlayerView
,从父view
移除,添加到当前viewController
的view
上面,当退出播放器时,再将videoPlayerView
从再viewController
的view
移除,重新添加到[UIApplication sharedApplication].keyWindow
上。这样也会导致外部相应函数不响应,造成这种问题的原因有可能是响应链被打乱了。
解决方法:
在语音的点播界面的viewDidLoad
函数里面,将videoPlayerView
重新添加到[UIApplication sharedApplication].keyWindow
就可以。
之所以在viewDidLoad
函数里面重新添加到[UIApplication sharedApplication].keyWindow
就可以使得外部响应函数能够响应,估计是在viewDidLoad
这个函数里面或是之后,重新梳理了响应链条。