gpt4 book ai didi

ios - 将 kvc 观察器添加到动态可重用单元

转载 作者:行者123 更新时间:2023-11-30 12:15:32 26 4
gpt4 key购买 nike

我正在尝试向我的可重用单元添加一个观察者,问题是它添加了多个观察者。所以我想知道是否有什么办法可以解决这个问题,因为我真的需要这个观察者。

var player: AVPlayer?

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

几乎所有帖子都是视频数组,每次将帖子设置为表格 View 上的一行时都会调用此数组。

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

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")
}

最佳答案

我理解你的问题,如果你在删除观察者时遇到问题,那么你可以在下面的委托(delegate)方法UITableView中管理它。

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不变。意思是创建观察者或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

关于ios - 将 kvc 观察器添加到动态可重用单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45475795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com