2017-08-29 12 views
0

私はこれを解決するためにどこでも検索しました。この質問を書いて私の運をもう一度試してみてください。私は名前とIDを含むXML URLデータを解析したcollectionViewCellを持っています。今すぐセルをタップすると、その中にAVPlayerを持つUIViewをロードします。ファイルを再生するには、別のURLを使用する必要がありますが、そのセルで解析したIDを使用する必要があります。ここにある私のdidSelectItem func:私は私の項目NSObjectクラスからではなく、UIViewの負荷が細かいセルを選択した後の項目を設定していますが再生されないUICollectionVIewCellデータでUIViewを読み込めません

import UIKit 

import AVFoundation 

class PlayerView: UIView { 

    var item: Item? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     backgroundColor = UIColor.black 

     let id = item?.itemId 

     if let url = URL(string: "http://xample.com/play.m3u?id=\(id)") { 
      let player = AVPlayer(url: url) 
      print(url) 
      let playerLayer = AVPlayerLayer(player: player) 
      self.layer.addSublayer(playerLayer) 
      playerLayer.frame = self.frame 

      player.play() 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

class PlayerLauncher: NSObject { 

     func showPlayer() { 

      if let keyWindow = UIApplication.shared.keyWindow { 
       let view = UIView(frame: keyWindow.frame) 
       view.backgroundColor = UIColor.white 

       view.frame = CGRect(x: 0, y: keyWindow.frame.height - 50, width: view.frame.width, height: 50) 

       let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height) 
       let playerView = PlayerView(frame: playerFrame) 
       view.addSubview(playerView) 

       keyWindow.addSubview(view) 

       UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
        view.frame = keyWindow.frame 
       }, completion: nil) 
      } 
     } 
    } 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     let playerLauncher = PlayerLauncher() 
     playerLauncher.showPlayer() 
} 

は、これは私のPlayerLauncherファイルですファイルはid = nilです。どうすれば修正できますか?

更新:私のコードを少し変更しました。私はIDを印刷することができます。私はPlayerViewとPlayerLauncherクラスにいくつかのコードを変更し、この後

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

     collectionView.deselectItem(at: indexPath, animated: true) 

     let playerView = PlayerView() 
     playerView.item = items?[indexPath.item] 

     let playerLauncher = PlayerLauncher() 
     playerLauncher.showPlayer() 
} 

ここで私はdidSelectItem方法で行った変更がある

import UIKit 
import AVFoundation 

class PlayerView: UIView { 

    var id: String? 

    var item: Item? { 
     didSet { 
      id = item?.itemId 
      print(id) 
     } 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     backgroundColor = UIColor.black 
    } 

    func startPlaying() { 

     if let url = URL(string: "http://xample.com/play.m3u?id=\(id)") { 
      let player = AVPlayer(url: url) 
      print(url) 
      let playerLayer = AVPlayerLayer(player: player) 
      self.layer.addSublayer(playerLayer) 
      playerLayer.frame = self.frame 

      player.play() 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

class PlayerLauncher: NSObject { 

    func showPlayer() { 

     if let keyWindow = UIApplication.shared.keyWindow { 
      let view = UIView(frame: keyWindow.frame) 
      view.backgroundColor = UIColor.white 

      view.frame = CGRect(x: 0, y: keyWindow.frame.height - 50, width: view.frame.width, height: 50) 

      let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height) 
      let playerView = PlayerView(frame: playerFrame) 
      view.addSubview(playerView) 

      keyWindow.addSubview(view) 

      UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
       view.frame = keyWindow.frame 
      }, completion: { (completeAnimation) in 
       playerView.startPlaying() 
      }) 
     } 
    } 
} 

は、今私はdidSetからIDを印刷することができますが、 startPlaying()メソッドでは、それを選択するとまだid = nilと表示されます。 didSetのプロパティをinitまたはstartPlaying() funcに設定するにはどうすればよいですか?

答えて

0

は、最後にそれを修正します!

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    if let item = items?[indexPath.item] { 
     showPlayer(item: item) 
    } 
} 

func showPlayer(item: Item) { 

    let playerLauncher = PlayerLauncher() 
    playerLauncher.item = item 
    playerLauncher.showVideoPlayer() 
} 

PlayerViewで、私はへinitdidSet、編集:didSelectItem方法で :ここで私は、コードで行った変更されている

var item = Item() 

init(frame: CGRect, item: Item) { 
    super.init(frame: frame) 
    self.item = item 

    setupPlayerView() 
    backgroundColor = UIColor(white: 0.3, alpha: 1) 
} 

方法setupPlayerViewでは、私がitemIdを設定し、最後にPlayerLauncherに追加しました:

var item = Item() 

Ho将来的に誰かがこのソリューションを投稿するのに役立つかもしれません。私を助けてくれた@sChaに大きな感謝を!

0

PlayerViewクラスのアイテムプロパティは、イニシャライザで設定されません。そこに設定するか、PlayerViewのインスタンスを作成するクラスにアイテムプロパティを設定する必要があります。それ以外の場合は常にゼロになります。

+0

ありがとうございます。どうすればインスタンスを作成できますか教えてください。 – Mohit

0

セルを選択するときは、おそらくItemの情報を取得する必要があります。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let item: Item = itemList[indexPath.item] // just for instance 
    let playerLauncher = PlayerLauncher() 
    playerLauncher.showPlayer(item) 
} 

ので、あなたは以下のようなあなたのPlayerなものに変更する必要があります:

class PlayerLauncher: NSObject { 

    func showPlayer(item: Item) { 

     if let keyWindow = UIApplication.shared.keyWindow { 
      let view = UIView(frame: keyWindow.frame) 
      view.backgroundColor = UIColor.white 

      view.frame = CGRect(x: 0, y: keyWindow.frame.height - 50, width: view.frame.width, height: 50) 

      let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height) 
      let playerView = PlayerView(frame: playerFrame) 
      playerView.item = item // Here 
      view.addSubview(playerView) 

      keyWindow.addSubview(view) 

      UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
       view.frame = keyWindow.frame 
      }, completion: { _ in 
       playerView.startPlaying() // And here 
      }) 
     } 
    } 
} 

をしてPlayerViewに:UPDATED

class PlayerView: UIView { 

    var item: Item? 
    var player: AVPlayer? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     backgroundColor = UIColor.black 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func startPlaying() { 
     let id = item?.itemId 

     if let url = URL(string: "http://xample.com/play.m3u?id=\(id)") { 
      self.player = AVPlayer(url: url) 
      print(url) 
      let playerLayer = AVPlayerLayer(player: self.player) 
      self.layer.addSublayer(playerLayer) 
      playerLayer.frame = self.frame 

      self.player.play() 
     } 
    } 
} 

これを試してみてください何が起こるか見る:

func startPlaying() { 
    guard let id = id else { print("** id is nil"); return } // here 
    print("* item id = \(id)")   // and here 

    if let url = URL(string: "http://xample.com/play.m3u?id=\(id)") { 
     let player = AVPlayer(url: url) 
     print(url) 
     let playerLayer = AVPlayerLayer(player: player) 
     self.layer.addSublayer(playerLayer) 
     playerLayer.frame = self.frame 

     player.play() 
    } 
} 

UPDATED#2:再び

、全体コード:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let item = items?[indexPath.item] 
    let playerLauncher = PlayerLauncher() 
    playerLauncher.showPlayer(item) 
} 

と:

class PlayerLauncher: NSObject { 

    func showPlayer(item: Item) { 

     if let keyWindow = UIApplication.shared.keyWindow { 
      let view = UIView(frame: keyWindow.frame) 
      view.backgroundColor = UIColor.white 

      view.frame = CGRect(x: 0, y: keyWindow.frame.height - 50, width: view.frame.width, height: 50) 

      let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height) 
      let playerView = PlayerView(frame: playerFrame) 
      playerView.item = item // Here 
      view.addSubview(playerView) 

      keyWindow.addSubview(view) 

      UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
       view.frame = keyWindow.frame 
      }, completion: { _ in 
       playerView.startPlaying() // And here 
      }) 
     } 
    } 
} 

class PlayerView: UIView { 

    var id: String? 
    var item: Item? { 
     didSet { 
      id = item?.itemId 
      print(id) 
     } 
    } 
    var player: AVPlayer? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     backgroundColor = UIColor.black 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func startPlaying() { 
     guard let id = id else { print("** id is nil"); return } // here 
     print("* item id = \(id)")   // and here 

     if let url = URL(string: "http://xample.com/play.m3u?id=\(id)") { 
      self.player = AVPlayer(url: url) 
      print(url) 
      let playerLayer = AVPlayerLayer(player: self.player) 
      self.layer.addSublayer(playerLayer) 
      playerLayer.frame = self.frame 

      self.player.play() 
     } 
    } 
} 
+0

こんにちは!まだid = nilと表示されます。 PlayerViewクラスを変更する必要がありますか?これは私がAVPlayerにリンクを再生するよう呼びかけているからです。 – Mohit

+0

@Mohitあなたの 'PlayerView'は初期化時に再生を開始するようですが、残念ですがコードを見ていますので、' item'を 'init'に渡すか、動作方法を変更する必要があります。私は答えにいくつかのコードを追加します。 – sCha

+0

@モートともう1つ。私はあなたのAVPlayerインスタンスがクラス内でグローバルに宣言されるべきだと考えています。私の答えにも追加されました。 – sCha

関連する問題