将kvc观察者添加到动态可重用单元格

时间:2017-08-03 05:47:03

标签: ios swift avplayer

我正在尝试将一个观察者添加到我的可重用单元格中,问题是它添加了多个观察者。所以我想知道是否有任何办法,因为我真的需要这个观察者。

var player: AVPlayer?

var post: Post? {
    didSet {
      updateView()
    }
}

相当多的帖子是一个视频数组,每次将帖子设置为表格视图中的一行时,都会调用此视频。

这就是我无法在此方法中添加观察者的原因,因为它将设置多个观察者。

func updateView() {
    if let videoUrlString = post?.videoURL {
        let videoUrl = URL(string: videoUrlString)
        player = AVPlayer(url: videoUrl!)
        playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = postVideoView.frame
        playerLayer.frame.size.width = UIScreen.main.bounds.width
        self.postVideoView.layer.addSublayer(playerLayer)
        player?.play()
        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil, using: { (_) in
            DispatchQueue.main.async {
                self.player?.seek(to: kCMTimeZero)
                self.player?.play()
            }
        })
}

    self.updateLike(post: self.post!)
}

然后我尝试在awakeFromNib()方法中设置它。

override func awakeFromNib() {
    super.awakeFromNib()
    player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
}

但由于播放器尚未完全初始化,因此无效。

这是我的观察员功能:

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "currentItem.loadedTimeRanges" {
        if let duration = player?.currentItem?.duration {
            let seconds = CMTimeGetSeconds(duration)

            let secondsText = Int(seconds) % 60
            let minutesText = String(format: "%02d", Int(seconds) / 60)
            videoLengthLabel.text = "\(minutesText):\(secondsText)"
        }
    }
}

我如何移除观察者:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let cell = tableView.dequeueReusableCell(withIdentifier: "videoPostCell", for: indexPath) as! HomeTableViewCell
    cell.playerLayer.removeFromSuperlayer()
    cell.player?.pause()
    cell.player?.isMuted = true
    cell.delegate = self
    cell.player?.removeObserver(self, forKeyPath: "currentItem.loadedTimeRanges")
}

1 个答案:

答案 0 :(得分:0)

我了解您的问题,如果您在删除观察者时遇到问题,则可以在下面的委托方法override func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if let cell = cell as? CustomCell { // Remove your observer here // Stop Play Video } } 中进行管理。

cellForRowAtIndexPath

保持Projections.computed("coor", "$loc.geo.coor")原样。意思是创建观察者或ETC。

否则,在您的情况下,链接下方会有所帮助。

1)Add and remove observer from multiple AVPlayerItem on UITableViewCell

2)Play video on UITableViewCell when it is completely visible

3)Embedding videos in a tableview cell