2017-05-15 13 views
0

特定のビューを1回タップするとビデオを再生しようとしています。 .play()関数は、関数内のif文(if)内で直接呼び出すと正常に機能します(setupPlayerView()関数内のURLを「チェック」します)。最初の関数(setupPlayerViewdefInteractions)は、ビデオプレーヤのプロパティとサブビュー/サブレイヤなどを設定するオーバーライドinitで呼び出されます。最後の機能は、2番目の機能によってトリガーされます。私はと呼ばれ、以下の機能を持つシングルタップを検出するために、FUNC#1 関数内の変数にアクセスする

func setupPlayerView() { 

    //insert url 
    let urlString = "https://blurtime.com/images/testvideo.mov" 

    //check URL if can be converted to NSURL 
    if let videoURL = NSURL(string: urlString){ 

     //player's video 
     let player = AVPlayer(url: videoURL as URL) 

     //add sub-layer 
     let playerLayer = AVPlayerLayer(player: player) 
     self.layer.addSublayer(playerLayer) 
     playerLayer.frame = self.frame 

     //when are frames actually rendered (when is video loaded) 
     player.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil) 

     //if I call player.play() here the video plays directly 

    } 

} 

IとしてUITapGestureRecognizersを:

コード... playerの宣言と下の私のコメントに注意を払います(すぐ前の関数の後に)同様のinitオーバーライド:

コード:#2

//set interactions 
func defInteractions(){ 
    //enable interaction 
    controlsContainerView.isUserInteractionEnabled = true 

    //singletap 
    let singleTap = UITapGestureRecognizer(target: self, action: #selector(singleTapDetected(_:))) 
    singleTap.numberOfTapsRequired = 1 

    //controlsContainerView 
    controlsContainerView.addGestureRecognizer(singleTap) 
} 

funcを、私はを呼び出すしたいと思います

コード:現在、このようになりますsingleTapDetected関数内他の人ではなく、私のように#3

func singleTapDetected(_ sender: UITapGestureRecognizer) { 

    player.play() 

} 

funcをしかし、それはこの関数として、もちろん動作しませんがオーバーライドINIT外にありますエラーuse of unresolved identifier 'player'を取得します。 player.play()に電話をかけて、最初の関数で呼び出した場合と同じ結果が得られますか? if内でアクセスできますか?

var player: AVPlayer? 

次に、このようにそれを初期化します:

if self.player == nil { 
    player = AVPlayer(url: videoURL as URL) 
} 

その後、あなたは簡単にどこでもあなたのクラスでからそれにアクセスすることができ、私は

+0

'player'をプロパティにします。 – rmaddy

答えて

1

playerインスタンス変数を作成します...いくつかの助けを必要とすることができます。

+0

verありがとう! – Moritz

1

このようなプレーヤープロパティグローバル行います

func setupPlayerView() { 

//insert url 
let urlString = "https://blurtime.com/images/testvideo.mov" 

//check URL if can be converted to NSURL 
if let videoURL = NSURL(string: urlString){ 

    //player's video 
    self.player = AVPlayer(url: videoURL as URL) 

    //add sub-layer 
    let playerLayer = AVPlayerLayer(player: player) 
    self.layer.addSublayer(playerLayer) 
    playerLayer.frame = self.frame 

    //when are frames actually rendered (when is video loaded) 
    player.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil) 

    //if I call player.play() here the video plays directly 

} 

} 

とこのようにそれを使用します:

func singleTapDetected(_ sender: UITapGestureRecognizer) { 
    // with self 
    self.player.play() 

} 

let player : AVPlayer? 

setupPlayerView()でそれを初期化しますそれが役に立てば幸い

+0

verありがとう! – Moritz

1

クラスレベルでplayerをオプションで宣言します。

var player: AVPlayer? 
0

は、代わりにsetupPlayerView関数内のローカル変数としてplayerを宣言するには、クラス全体/構造体の範囲でアクセスできるように、インスタンス変数を宣言する必要があります。あなたのケースでは

、私の代わりにsetupPlayerView機能を実装するので以下のように、怠惰プロパティとしてそれを宣言することをお勧めだろうことを示唆している:

lazy var player: AVPlayer? = { 
    //insert url 
    let urlString = "https://blurtime.com/images/testvideo.mov" 

    guard let videoURL = NSURL(string: urlString) else { 
     return nil 
    } 

    let player = AVPlayer(url: videoURL as URL) 

    //add sub-layer 
    let playerLayer = AVPlayerLayer(player: player) 
    self.layer.addSublayer(playerLayer) 
    playerLayer.frame = self.frame 

    //when are frames actually rendered (when is video loaded) 
    player.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil) 

    return player 
}() 

使用法:

// this means if the urlString is valid 
if let player = player { 
    player.play() 
} 

これは、playerのために必要なすべてのセットアップが、必要に応じての準備ができていることにつながります。これはQ&Aにチェックしてください。

関連する問題