获取错误线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)加载AVPlayer

问题描述:

我想,当我选择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

我做了一个指南,希望能够显示您误解的内容。

我对其他读者不使用MARKDOWN文本格式表示歉意,但请认为这是我对原始海报的最大努力。我们已经在前一篇文章中进行了充分的讨论。

enter image description here

那么,你如何解决这个问题? 我想没有什么好东西直接给你代码,请尝试修复基于这些信息的代码。

如果您还有其他问题,我将尽力帮助您:)

+0

嘿!我终于修好了!谢谢你的帮助! :D – Mohit

+0

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

看来

class PlayerLauncher: NSObject 

没有办法引用

let playerView = PlayerView() 

尝试定义这些功能范围之外,使他们能够通过功能改变和功能外引用。

+0

我删除了'setupPlayer()'func,并在'override init'中写入了AVPlayer代码。它现在不会崩溃,但'itemId'现在是空的,它不会播放任何东西。 – Mohit

+0

只是做了另一个变种,你传递给任何需要它后/初始化 – solenoid