启动和停止 segued AVPlayer 的功能是什么?

what are the functions to start and stop a segued AVPlayer?

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

我的手表连接正在发送 "start" 和 "stop" 消息命令。我如何编写此处的函数以响应玩家并做出反应?

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' 但它没有解决问题。

我可以 post 一个示例来展示您如何 "fix" 您现有的代码,但这对您没有任何帮助。您目前尝试实现这一点的方式非常复杂,重新思考如何在应用的不同部分之间传递数据会对您的应用有益。

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

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

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

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

  • post 以及讨论如何设置 WCSession 管理器的互联网教程。

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

如果您以这种方式重新设计您的应用程序,您就可以使用通知来完成您想要的。例如,您的会话管理器可以 post 根据它从手表收到的消息发出适当的通知,并且您的 AVPlayer 视图控制器可以观察并对 "start"、"stop",以及 "volume" 条通知。

还有其他选择吗?

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

但请记住,您(或其他人)必须在以后维护此代码。您现在尝试通过 "cutting corners," 或使用 "quick and dirty hacks," 保存的任何时间都将在以后浪费。不要惊讶地发现自己对自己(或其他人)编写的旧代码感到恐惧,或者试图 remember/understand 为什么 you/they 选择那样做,并希望你不会无意中破坏东西因为所有的卷积。

回答问题中更简单的部分,即什么函数会从 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()

}

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