首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nib awakefromNib()崩溃

Nib awakefromNib()崩溃
EN

Stack Overflow用户
提问于 2019-09-12 22:04:01
回答 2查看 318关注 0票数 0

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

代码语言:javascript
复制
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和正确的重用标识符。当我试着像这样叫尼布的时候。

代码语言:javascript
复制
let sensorView = CardSensors()
sensorView.awakeFromNib()

我得到了Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value.我试图强迫这些值,但我总是会犯一些错误。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-13 08:00:42

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

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

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2019-09-13 04:05:28

您不应该自己调用awakefromNib,因为在您输入视图之后将通过使用UINib或从Bundle.main.loadNibNamed加载Nib来调用awakefromNib。您可以使用以下方法修复错误:

代码语言:javascript
复制
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
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57915039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档