0

セグエ 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)
    }
}

「player.Play() および player.StopPlay() の行で未解決の識別子 'player' を使用しています。'player' を 'AVPlayer'、'destination'、および 'AVPlayerViewController' に置き換えようとしましたが、エラー メッセージが表示されます。それはそれを修正しません。

4

2 に答える 2

3

既存のコードを「修正」する方法を示す例を投稿できますが、それはあなたに何の恩恵ももたらしません。現在これを実装しようとしている方法は非常に複雑であり、アプリのさまざまな部分間でデータを渡す方法を再考することは、アプリにとって有益です。

ビュー コントローラーは、独自のビューを制御することを目的としています。(セグエを介して)提示した別のコントローラーで何かを制御しようとするべきではありません。

  • AVPlayer提示(ソース)View Controllerから提示(宛先)View Controllerにオブジェクトを渡すことはお勧めしません。url代わりに、単純にinを渡すことができますprepareForSegue

  • これにより、宛先ビュー コントローラーが独自の をインスタンス化できるようになりAVPlayer、プレーヤーをそのビュー コントローラー内にカプセル化できるようになります。カプセル化に合わせて、他のView Controllerがそのオブジェクトについて知る(または対話する)必要はありません。

ウォッチセッションからプレーヤーを「制御」することに関して、私が提案するのは、アプリ全体のセッションマネージャーを設定することです. WCSessionこれにより、セッションの責任がビュー コントローラー (実際には属していない場所) から移動し、1 つの (非アクティブ、ソース) ビュー コントローラーが別の (アクティブ、宛先) ビュー コントローラーに代わってメッセージを処理できるようにする複雑さがなくなります。

  • いくつ WCSession投稿と、マネージャーのセットアップ方法を説明するインターネット チュートリアルがあります。

  • 機能を個別のモジュールに分離すると、コードの保守も容易になります (また、単体テスト中にコードのさまざまな部分を挿入またはモックできます)。

この方法でアプリを再設計すると、通知を使用して目的を達成できます。たとえば、セッション マネージャーは、ウォッチから受信したメッセージに基づいて適切な通知を送信できます。AVPlayerビュー コントローラーは、「開始」、「停止」、および「音量」の通知を観察して対応できます。

他のオプションはありますか?

単純に複雑なアプローチを機能させたい場合は、デリゲートを設定する (2 番目のビュー コントローラーがそのプレーヤーの制御を最初のビュー コントローラーに委任する) か、最初のビュー コントローラーが 2 番目のビューへの参照を維持するようにすることができます。コントローラーなので、プレーヤーを直接操作できます。

ただし、あなた (または他の誰か) がこのコードを今後維持する必要があることに注意してください。「手抜き」や「手っ取り早い裏技」で節約しようとしても、後で無駄になります。あなた(または他の誰か)が書いた古いコードに恐怖を感じたり、なぜあなたや彼らがそのようにしたのかを思い出したり理解しようとしたりしても驚かないでください。畳み込み。

于 2016-08-17T18:59:24.153 に答える
-1

どの関数がセグエからの再生をトリガーするかという質問のより単純な部分に答えて(実際の自動再生として)、コードが次のように解決しました:

destination.player!.play()

ここに示すように、関数はdestination.player!.play()である必要があるため、destination.play()と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 に答える