Ios Nib awakefromNib()崩溃
我有一个带有标签和collectionView的类,下面是我的代码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()
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