一. 問題
我們的項目需求是這樣的:
- 課程有語音和視頻兩種類型题翰,當前點播的課程,退出點播界面之后窖张,也可以全局播放幕随,下次再次進入點播界面,如果是同一個課程宿接,定位到上次播放的地方赘淮,接著播放,如果不是同一課程澄阳,重新播放拥知。
- 課程種類有系列課和單品課程,系列課程可以上一首和下一首碎赢,當前課程播放完畢之后低剔,自動播放下一首。
- 語音課程進入后臺肮塞,可以鎖屏操作襟齿,視頻課程進入后臺,暫停播放枕赵,回到前臺繼續(xù)播放猜欺。
就類似音樂播放器。
我選用單例做了個全局的播放器拷窜。當點播如果是視頻課程开皿,在點播界面將播放器添加到點播界面的view,退出點播界面將播放器移除篮昧。
我將鎖屏后赋荆,后臺操作的遠程控制事件,放在了播放器的view里面進行判斷懊昨。
但是外部事件的函數(shù)確一直沒有相應窄潭。
//重寫父類方法,接受外部事件的處理
- (void)remoteControlReceivedWithEvent: (UIEvent *)receivedEvent
三. 分析 與 解決
原因:
雖然videoPlayerView
(播放器)成為了第一響應者酵颁,但是由于videoPlayerView
沒有被添加到相應的父類中嫉你,隱藏響應鏈無法傳遞月帝,導致了接收外部事件的函數(shù)沒有響應。
解決方法:
因此在單例里幽污,我在videoPlayerView
加載的時候?qū)⑵涮砑拥?code>[UIApplication sharedApplication].keyWindow上面嚷辅。這樣外部相應函數(shù)就會響應。
原因:
但由于視頻點播界面時油挥,需要將videoPlayerView
潦蝇,從父view
移除,添加到當前viewController
的view
上面深寥,當退出播放器時攘乒,再將videoPlayerView
從再viewController
的view
移除,重新添加到[UIApplication sharedApplication].keyWindow
上惋鹅。這樣也會導致外部相應函數(shù)不響應则酝,造成這種問題的原因有可能是響應鏈被打亂了。
解決方法:
在語音的點播界面的viewDidLoad
函數(shù)里面闰集,將videoPlayerView
重新添加到[UIApplication sharedApplication].keyWindow
就可以沽讹。
之所以在viewDidLoad
函數(shù)里面重新添加到[UIApplication sharedApplication].keyWindow
就可以使得外部響應函數(shù)能夠響應,估計是在viewDidLoad
這個函數(shù)里面或是之后武鲁,重新梳理了響應鏈條爽雄。