0

如何触发 segued iOSAVPlayer开始和停止播放(使用 Swift 2.2)?

My Watch Connectivity 正在发送“开始”和“停止”消息命令。我如何在此处编写函数以响应播放器并做出反应?

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)
    }
}

我收到错误消息“在 player.Play() 和 player.StopPlay() 行上使用未解析的标识符 'player'。我尝试将 'player' 替换为 'AVPlayer'、'destination' 和 'AVPlayerViewController' 但它不能解决它。

4

2 回答 2

3

我可以发布一个示例,展示如何“修复”现有代码,但这对您没有任何帮助。您当前尝试实现此功能的方式非常复杂,重新考虑如何在应用程序的不同部分之间传递数据将使您的应用程序受益。

视图控制器旨在控制自己的视图。它不应该试图控制它呈现的不同控制器中的某些东西(通过 segue)。

  • 我不建议将AVPlayer对象从呈现(源)视图控制器传递到呈现(目标)视图控制器。相反,您可以简单地传递urlin prepareForSegue

  • 这将允许目标视图控制器实例化它自己的AVPlayer,并让播放器被封装在该视图控制器中。为了与封装保持一致,其他视图控制器不需要知道(或尝试与该对象交互)。

关于从观看会话“控制”播放器,我建议设置一个应用程序范围的会话管理器。这将会话职责从视图控制器中移出(它实际上不属于),并消除了试图让一个(非活动的,源)视图控制器WCSession代表另一个(活动的,目标)视图控制器处理消息的复杂性。

  • 几篇文章以及讨论如何设置经理的互联网教程。 WCSession

  • 将功能分离到单独的模块中还可以更轻松地维护代码(并允许您在单元测试时注入或模拟代码的不同部分)。

如果你以这种方式重新设计你的应用程序,你就可以使用通知来完成你想要的。例如,您的会话管理器可以根据从手表接收到的消息发布适当的通知,您的AVPlayer视图控制器可以观察并响应“开始”、“停止”和“音量”通知。

还有其他选择吗?

如果您只是想让复杂的方法起作用,您可以尝试设置一个委托(让第二个视图控制器将其播放器的控制委托给第一个视图控制器),或者让第一个视图控制器维护对第二个视图的引用控制器,因此它可以直接操纵其播放器。

但请记住,您(或其他人)将不得不在以后维护此代码。任何时候你现在试图通过“偷工减料”或使用“快速而肮脏的黑客”来节省时间,以后都会被浪费掉。不要惊讶地发现自己对您(或其他人)编写的旧代码感到震惊,或者试图记住/理解您/他们选择这样做的原因,并希望您不会因为所有这些而无意中破坏了东西卷积。

于 2016-08-17T18:59:24.153 回答
-1

回答更简单的问题,即什么函数会从 segue 触发播放(作为有效的自动播放),我已经解决了代码是:

目的地.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()

}

在手表连接函数中调用 'destination.player!.play()' 和 'destination.player!.pause()' 不会带来任何错误。但是,在按下我的手表按钮以发送“destination.player!.play()”的“开始”消息或暂停消息时,我的手表应用程序崩溃了,所以 - 根据@PetahChristian 的回答/明智的建议,这似乎是与其他代码冲突,并且“自动播放”只能作为一种快速而肮脏的解决方案。

于 2016-08-17T21:09:46.723 回答