首页 > 解决方案 > Nib awakefromNib() 崩溃

问题描述

我有一个带有标签和 collectionView 的类,这是我的代码。

class CardSensors: UIView {
    @IBOutlet weak var botName: UILabel!
    @IBOutlet weak var sensorsCollectionView: UICollectionView!

    var viewModel: NewsFeedViewModel! {
        didSet {
            setUpView()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        let nibName = UINib(nibName: "SensorCollectionViewCell", bundle:nil) 
        sensorsCollectionView.register(nibName, forCellWithReuseIdentifier: "SensorCollectionViewCell")

        // Initialization code
    }

    func setUpView() {
        botName.text = viewModel.botName
    }

}

显然,我的单元格具有正确的 ID 和正确的重用标识符。当我尝试这样称呼笔尖时。

let sensorView = CardSensors()
sensorView.awakeFromNib()

我明白了Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value。我试图强制这些值,但我总是遇到一些错误。

我究竟做错了什么?

标签: iosswift

解决方案


正如其他人提到的,您不应该手动调用 awakeFromNib(),这类似于自动调用 viewDidLoad() 和 viewWillAppear() 的方式,操作系统将触发它以让您知道您的视图已加载。

要初始化您的视图,您可以使用以下静态函数,它允许您调用类来创建 CardSensors 的新实例。

class CardSensors: UIView {
    @IBOutlet weak var botName: UILabel!
    @IBOutlet weak var sensorsCollectionView: UICollectionView!

    var viewModel: NewsFeedViewModel! {
        didSet {
            setUpView()
        }
    }

    static func loadFromNib() -> CardSensors {
        return Bundle.main.loadNibNamed("CardSensors", owner: nil, options: nil)?.first as! CardSensors
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        sensorsCollectionView.register(nibName, forCellWithReuseIdentifier: "SensorCollectionViewCell")
    }

    func setUpView() {
        botName.text = viewModel.botName
    }
}


let sensorView = CardSensors.loadFromNib()

推荐阅读