在UITableViewCell

时间:2016-04-14 19:20:49

标签: ios swift avfoundation avplayerlayer avplayeritem

我正在尝试制作一个可以使用AVPlayerAVPlayerItem播放多个视频的表格视图,我需要将addObserver添加到每个AVPlayerItem,以便我可以跟踪playbackLikelyToKeepUp属性

我尝试和失败的是在设置AVPlayerItem并在deinit的{​​{1}}中删除它后添加观察者,但由于单元格从未被释放但是已经出列,所以这赢得了#39;工作,我会得到这个错误

UITableViewCell

搜索后我想出了这个

  • 我不应该在An instance 0x14eedebc0 of class AVPlayerItem was deallocated while key value observers were still registered with it. 上添加或删除观察者,但我必须这样做,因为播放器项目是在单元格子类中生成的
  • 处理观察者的最佳方法是在UITableViewDelegate'方法
  • 添加UITableViewCell并删除willDisplayCell

但即便如此,在我的情况下也不起作用,因为didEndDisplayingCell需要时间来初始化

AVPlayerItem

所以观察者不会在override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell cell.setUpPLayer() return cell } override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { let cell = cell as! TableViewCell if cell.Player == nil { self.addObserversToCell(cell) } } override func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { let cell = cell as! TableViewCell self.removeMyObserversFromCell(cell) } 中添加,但会调用删除观察者并导致运行时错误

willDisplayCell

如果有人知道如何实现这一点,我会很高兴知道吗?感谢

2 个答案:

答案 0 :(得分:3)

因此,对我有用的最佳解决方案是继承AVPlayerItem并使用协议委托回任何符合AMPlayerItemDelegate的类

这是我怎么做的

protocol AMPlayerItemDelegate {
    func playbackLikelyToKeepUp()
}

class AMPlayerItem: AVPlayerItem {

   var delegate : MyPlayerItemDelegate?

   init(URL: NSURL) {
       super.init(asset: AVAsset(URL: URL) , automaticallyLoadedAssetKeys:[])
       self.addMyObservers()
   }

   deinit {
       self.removeMyObservers()
   }

   func addMyObservers() {
       print("Adding")
       self.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: [.New], context: nil)
   }

   func removeMyObservers() {
       print("Removing")
       self.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp", context: nil)
   }

   override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
       if keyPath == "playbackLikelyToKeepUp" {
           self.delegate?.playbackLikelyToKeepUp()
       }
   }

}

答案 1 :(得分:0)

尝试覆盖&#39; prepareForReuse&#39;在UITableViewCell子类中运行,并删除该位置的观察者。

override func prepareForReuse() {
    super.prepareForReuse()

    //remove observer here...
}