我是iOS / swift编程的新手,我正在开发一个由别人开发的应用程序,修复一些错误。
该应用程序本质上是一个音乐播放器,音乐也必须在后台播放,可以从锁定屏幕播放/暂停/跳过。该应用程序有几个视图,其中一个是主视图,包含与播放器本身相关的所有代码(player.swift),其他视图包含其他附加页面/功能。
来自锁定屏幕的命令仅在我从主视图开始锁定屏幕时起作用,如果我从另一个视图开始执行(例如帮助视图,这只是帮助视图,当帮助时显示在播放器上方链接被点击)他们不工作。在这里阅读几篇文章我已经意识到原因是相关的代码在player.swift中:
override func remoteControlReceivedWithEvent(event: UIEvent) {
if (event.type == UIEventType.RemoteControl) {
switch (event.subtype) {
case UIEventSubtype.RemoteControlPlay:
self.onPlayPause(self);
case UIEventSubtype.RemoteControlPause:
self.onPlayPause(self);
case UIEventSubtype.RemoteControlTogglePlayPause:
self.onPlayPause(self);
case UIEventSubtype.RemoteControlNextTrack:
onNext(nil)
default:
break
}
}
}
所以我已经理解了这个问题,但即使我已经阅读了几篇相关文章(包括remoteControlReceivedWithEvent called on iOS 7.0 device but not iOS 8.0,Using lock screen for my app?,Swift. Receive remote control events to work with MPNowPLayingInfoCenter),我也无法弄清楚我需要在哪里移动此代码,如果我需要移动其他内容或进行修改。
EDIT。我按照建议移动AppDelegate.swift中的代码(删除player.swift中的代码)。即使我从不同于player.swift的视图中锁定设备,它现在似乎也会拦截命令。不过我有两个问题:
1)它似乎只运行一次,如果我从锁定屏幕点击“下一步”,我可以从调试字符串中看到命令被截获,如果我第二次没有发生任何事情
2)我需要从AppDelegate.swift调用player.swift中的方法(onPlayPause和onNext),我猜这些方法期望设置一个玩家对象和/或它们引用在player.swift和I中声明的变量不知道如何处理这个问题。例如,onNext方法声明为
@IBAction func onNext(sender: AnyObject?) {
oldImage = iAlbumArt.image
.......
如果我将该方法作为AppDelegate的新实例调用
player().onNext(nil)
我收到错误,因为iAlbumArt.image是NIL。 iAlbumArt是在Player类中声明为
的变量 @IBOutlet weak var iAlbumArt: UIImageView!
对于天真的问题感到抱歉,但几周前我一直在研究iOS开发。
答案 0 :(得分:0)
尝试将其添加到App Delegate类。
要将远程控制事件转发到视图控制器,请将此代码添加到应用程序委托(假设您的播放器视图控制器被调用PlayerViewController
):
let vcs = (self.window!.rootViewController as! UINavigationController).viewControllers
let indexOfPlayer = (vcs as! NSArray).indexOfObjectPassingTest { (vc, idx, stop) in
return (vc.isKindOfClass(PlayerViewController))
}
let playerVC = vcs[indexOfPlayer];
override func remoteControlReceivedWithEvent
方法放入App Delegate Class。self
替换为playerVC
。onPlayPause
和onNext
功能。注意:的 这段代码的原因是:
player().onNext(nil)
抛出错误是因为player()
创建了一个全新的玩家类实例。您希望使用现有实例,以便更改反映在屏幕上。