我有一个带有标签和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。我试图强迫这些值,但总有一些错误。
我做错什么了?

最佳答案

正如其他人提到的,您不应该手动调用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()

10-05 20:36
查看更多