UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误

Posted

技术标签:

【中文标题】UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误【英文标题】:AVPlayer in UITableViewCell results in "Unexpectedly found nil while implicitly unwrapping an Optional value" error 【发布时间】:2020-03-21 09:29:30 【问题描述】:

我正在尝试设置一个自定义 UITableViewCell,它将在单元格中包含一个视频播放器。

我收到了"Unexpectedly found nil while implicitly unwrapping an Optional value" 的电话:

"playerLayer.frame = self.videoPlayerSuperView.bounds"

这是我正在使用的代码:

import UIKit
import AVFoundation

class feedCell: UITableViewCell 


    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var viewsLabel: UILabel!
    @IBOutlet weak var postTextLabel: UILabel!
    @IBOutlet weak var videoPlayerSuperView: UIView!

    override func awakeFromNib() 
        super.awakeFromNib()
        let videoURL = URL(string: "https://some.url.of.an.mp4")
        let player = AVPlayer(url: videoURL!)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.videoPlayerSuperView.bounds
        self.videoPlayerSuperView.layer.addSublayer(playerLayer)
        player.play()
    

    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)
    

我该如何解决这个问题?

【问题讨论】:

您的videoPlayerSuperView 不是awakeFromNib 中的ready。创建单元格后,您可以使用它。例如创建一个单独的方法来设置框架。并在 cellForRow 中创建单元格后调用该方法。 谢谢,这是问题,现在已排序 【参考方案1】:

感谢@AjinkyaSharma

override func layoutSubviews() 
        super.layoutSubviews()

        let videoURL = URL(string: "https://some.url.of.an.mp4")
        let player = AVPlayer(url: videoURL!)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.videoPlayerSuperView.bounds
        self.videoPlayerSuperView.layer.addSublayer(playerLayer)
        player.play()

【讨论】:

【参考方案2】:

尝试添加延迟

override func awakeFromNib() 

    super.awakeFromNib()

   DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2 , 
   execute:
    
         let videoURL = URL(string: "https://some.url.of.an.mp4")
         let player = AVPlayer(url: videoURL!)
         let playerLayer = AVPlayerLayer(player: player)
         playerLayer.frame = self.videoPlayerSuperView.bounds
         self.videoPlayerSuperView.layer.addSublayer(playerLayer)
         player.play()

    )


【讨论】:

以上是关于UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误的主要内容,如果未能解决你的问题,请参考以下文章

更改 UITableViewCell 中的对象也更改了重用 UITableViewCell 的对象

确定 UITableViewCell 中的 UIButton

UITableViewCell 事件中的 UIButton 不起作用

UITableViewCell 中的 UICollectionView

UITableVIewCell 中的 UIScrollView 不会滚动

UITableViewCell 中的 UITextField - UIButton