如何触发受限制的iOS AVPlayer
开始和停止播放(使用Swift 2.2)?
我的观看连接正在发送"开始"并且"停止"消息命令。如何编写此处的函数以响应并响应播放器?
Watch连接消息正常工作,可以在另一个视图控制器中使用AudioPlayer播放音频。我现在正在尝试对此进行调整以控制视频。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let destination = segue.destinationViewController as!
AVPlayerViewController
let url = NSURL(string: self.specimen.filmMovieLink)
destination.player = AVPlayer(URL: url!)
}
// WATCH CONNECTIVITY MESSAGE TO TRIGGER START AND STOP VIDEO
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
var replyValues = Dictionary<String, AnyObject>()
switch message["command"] as! String {
case "start" :
//play video - correct here
player.Play()
replyValues["status"] = "Playing"
case "stop" :
//stop video - correct here
player.stopPlay()
replyValues["status"] = "Stopped"
case "volume" :
let level = message["level"] as! Float
//player.adjustVolume(level)
replyValues["status"] = "Vol = \(level)"
default:
break
}
replyHandler(replyValues)
}
}
我收到错误消息&#34;使用未解析的标识符&#39;播放器&#39;在线上播放Player.Play()和player.StopPlay()。我试过更换“玩家”#39;使用&#39; AVPlayer&#39;,&#39;目的地&#39;和&#39; AVPlayerViewController&#39;但它并没有解决它。
答案 0 :(得分:3)
我可以发布一个示例,说明如何“修复”现有代码,但它不会对您有所帮助。您目前正在尝试实施此方法的方式非常复杂,您的应用有利于重新思考如何在应用的不同部分之间传递数据。
视图控制器旨在控制其自己的视图。它不应该试图控制它所呈现的不同控制器中的某些内容(通过segue)。
我不建议将AVPlayer
对象从呈现(源)视图控制器传递到呈现的(目标)视图控制器。相反,您只需传递url
中的prepareForSegue
。
这将允许目标视图控制器实例化其自己的AVPlayer
,并让播放器封装在该视图控制器中。为了与封装保持一致,任何其他视图控制器都不需要知道(或尝试与该对象进行交互)。
关于从观看会话中“控制”玩家,我建议建立一个应用程序范围的会话管理器。这会将会话责任从视图控制器(它实际上不属于它)移出,并消除了尝试让一个(非活动的,源)视图控制器代表另一个(活动的,处理WCSession
消息的复杂性。目的地)查看控制器。
如果您以这种方式重新设计应用程序,则可以使用通知来完成您想要的任务。例如,您的会话管理员可以根据从手表收到的消息发布相应的通知,您的AVPlayer
视图控制器可以观察并响应“开始”,“停止”和“音量”通知。
还有其他选择吗?
如果您只是想让复杂的方法起作用,您可以尝试设置委托(让第二个视图控制器将其播放器的控制权委托给第一个视图控制器),或者让第一个视图控制器保持对第二个视图控制器,所以它可以直接操纵它的播放器。
但请记住,您(或其他人)将不得不维持此代码。任何时候你试图通过“偷工减料”或使用“快速和肮脏的黑客”来保存,将会被浪费。不要惊讶地发现自己对你(或其他人)写的旧代码感到恐惧,或者试图记住/理解你/他们选择这样做的原因,并希望你不要因为所有的事情而无意中破坏了卷积。
答案 1 :(得分:-1)
回答关于什么函数会从segue触发播放的问题的更简单部分(作为自动播放效果),我已经解决了代码是:
destination.player!.play()
我曾尝试过destination.play()和player.play(),因为该函数需要是destination.player!.play(),如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let destination = segue.destinationViewController as!
AVPlayerViewController
let url = NSURL(string: self.specimen.filmMovieLink)
destination.player = AVPlayer(URL: url!)
destination.player!.play()
}
拨打&#39; destination.player!.play()&#39;和&#39; destination.player!.pause()&#39;在手表连接功能中没有带来任何错误。 然而,按下我的手表按钮发送&#39;开始&#39;消息为&#39; destination.player!.play()&#39;或暂停消息,我的应用程序崩溃,所以 - 按照@ PetahChristian的回答/明智的建议,这似乎与其他代码,以及&#39;自动播放&#39;只能作为快速而肮脏的解决方案。