Ios Nib awakefromNib()崩溃

Ios Nib awakefromNib()崩溃,ios,swift,Ios,Swift,我有一个带有标签和collectionView的类,下面是我的代码 class CardSensors: UIView { @IBOutlet weak var botName: UILabel! @IBOutlet weak var sensorsCollectionView: UICollectionView! var viewModel: NewsFeedViewModel! { didSet { setUpView()

我有一个带有标签和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()
我发现
致命错误:在隐式展开可选值时意外发现nil
。我试图强制执行这些值,但总是出现一些错误


我做错了什么?

您不应该自己调用awakefromNib,因为在您使用UINib或load Nib from Bundle.main.loadnib初始化视图后,将调用awakefromNib。 您可以使用以下方法修复错误:

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

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

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

        // Initialization code
    }

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

正如其他人提到的,您不应该手动调用awakeFromNib(),这与自动调用viewDidLoad()和ViewWillExample()的方式类似,操作系统将启动它以告知您的视图已加载

要初始化视图,可以使用以下静态函数,该函数允许调用类来创建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()

您确定viewModel不是nil吗?您不应该自己调用
awakeFromNib
。在完成所有连接后,系统应调用该命令。正如apple docs所述:“nib加载基础设施向从nib存档重新创建的每个对象发送一条awakeFromNib消息,但只有在存档中的所有对象都已加载并初始化之后”。调用它将使
sensorscolectionview
为零,因为存档尚未加载。此外,在设置viewModel时,botName可能为零。考虑在调用StutuVIEW之前检查它,如果需要的话,在AukKeFiNib上重新调用它。我尝试了下面的答案,但不是真正的工作。您不应该在init中执行SysRoSsCopyVIEW视图,它将不会被初始化。由于未捕获的异常“NSInternalInconsistencyException”,应将从NIBIM发送到awakeFromNibIm获取此错误
终止应用程序,原因:“无法在捆绑包中加载NIB:”NSBundle
确保您的NIB名称正确,并且您的UINib文件已正确添加到应用程序目标是,实际上,我放了
CardSensor
,它是
CardSensor