2017-09-04 49 views
1

我想,當我選擇collectionViewCell加載一個AVPlayer的時候,這是我在didSelectItem代碼:獲取錯誤線程1:EXC_BAD_ACCESS(代碼= EXC_I386_GPFLT)加載AVPlayer

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

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

func showPlayer(item: Item) { 

    let playerLauncher = PlayerLauncher() 
    playerLauncher.showVideoPlayer() 

    let playerView = PlayerView() 
    playerView.item = item 
    playerView.setupPlayerView() 
} 

這是我PlayerLauncher文件:

class PlayerView: UIView { 

    var item: Item? { 
     didSet { 
      if let id = item?.itemId { 
       itemId = id 
      } 
     } 
    } 

    var itemId = String() 

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

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

    var player: AVPlayer? 

    func setupPlayerView() { 

     let baseurl = "http://xample.com/play.m3u?id=" 

     let urlString = "\(baseurl)\(itemId)" 
     print(urlString) 
     if let url = URL(string: urlString) { 
      player = AVPlayer(url: url) 

      let playerLayer = AVPlayerLayer(player: player) 
      self.layer.addSublayer(playerLayer) 
      playerLayer.frame = self.frame 

      let audioSession = AVAudioSession.sharedInstance() 
      do{ 
       try audioSession.setCategory(AVAudioSessionCategoryPlayback) 
      } catch let err { 
       print(err) 
       return 
      } 

      player?.play() 

      player?.addObserver(self, forKeyPath: "currentItem.status", options: .new, context: nil) 
     } 
    } 
} 

class PlayerLauncher: NSObject { 

    func showVideoPlayer() { 
     print("Showing the player...") 

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

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

      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: { (completedAnimation) in 
       //later... 

      }) 
     } 
    } 
} 

所以每當我選擇項目,播放器開始加載,控制檯打印URL(因爲我已經添加有print語句),這是它打印:

http://xample.com/play.m3u?id=12345 
(lldb) 

然後它在AppDelegate中崩潰並顯示Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)錯誤。我該如何解決它?

謝謝。

UPDATE:

我改變了didSelectItem FUNC一點。下面是代碼:

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

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

func showPlayer(item: Item) { 
    let playerLauncher = PlayerLauncher() 
    playerLauncher.showPlayer(item: item) 
} 

我改變了init方法PlayerView這樣:

var item: Item? { 
    didSet { 
     if let id = item?.itemId { 
      itemId = id 
     } 
    } 
} 

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

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

而且需要改變PlayerLauncher

let playerView = PlayerView(frame: playerFrame, item: item) 
view.addSubview(playerView) 

我把休息的let playerView線我可以看到通過那裏的項目ID。但它並沒有傳遞給PlayerView類中的urlString。因此,ID仍然是" "

+0

兄弟,您仍然犯同樣的錯誤。我不知道如何讓你明白這一點......但我會再試一次。 – sCha

回答

1

我做了一個指南,希望能夠顯示您誤解的內容。

我對其他讀者不使用MARKDOWN文本格式表示歉意,但請認爲這是我對原始海報的最大努力。我們已經在前一篇文章中進行了充分的討論。

enter image description here

那麼,你如何解決這個問題? 我想沒有什麼好東西直接給你代碼,請嘗試修復基於這些信息的代碼。

如果您還有其他問題,我將盡力幫助您:)

+0

嘿!我終於修好了!謝謝你的幫助! :D – Mohit

+0

@Mohit很高興知道它的工作! – sCha

0

看來

class PlayerLauncher: NSObject 

沒有辦法引用

let playerView = PlayerView() 

嘗試定義這些功能範圍之外,使他們能夠通過功能改變和功能外引用。

+0

我刪除了'setupPlayer()'func,並在'override init'中寫入了AVPlayer代碼。它現在不會崩潰,但'itemId'現在是空的,它不會播放任何東西。 – Mohit

+0

只是做了另一個變種,你傳遞給任何需要它後/初始化 – solenoid

相關問題