首页 > 解决方案 > 为什么 awakeFromNib() 中的 View 为零?

问题描述

我正在练习 awakeFromNib。

UIView我在 Main.storyboard 中有一个。这个 UIView 继承class CardView.

代码如下

class ViewController: UIViewController {

    @IBOutlet weak var cardView: CardView!

}

我有一个CardView.xib. 在 CardView.xib 中,有一个默认的单个 UIView 继承了class CardView. 在这个 UIView 内部,还有另一个继承了class CardContentView. 当然,我有一个 CardView.swift,它有class CardView.

代码如下

class CardView: UIView {

    @IBOutlet weak var cardContentView: CardContentView!

    override func awakeFromNib() {
        cardContentView.layer.cornerRadius = 16
    }
}

我有一个CardContentView.xib. 在 CardContentView.xib 中,有一个UIView继承了 default的默认单曲class UIView。当然,我有一个 CardContentView.swift ,它有class CardContentView.

代码如下

class CardContentView: UIView {

    @IBOutlet var backgroundView: UIView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    private func commonInit(){
        Bundle.main.loadNibNamed("CardContentView", owner: self, options: nil)
        self.addSubview(backgroundView)
    }

}

是的,我想CardContentView通过.cardViewclass CardView

但是当我运行时,错误弹出class CardView

错误行在func awakeFromNib

具体线路是cardContentView.layer.cornerRadius = 16

错误消息是Unexpectedly found nil while unwrapping an Optional value。特别是,cardContentView = nil

我不知道为什么cardContentView = nil

我将 Xib 板class CardView中的 cardContentView 链接到 CardView.swift 中。

我应该如何修改代码来运行它?

谢谢!

标签: swiftawakefromnib

解决方案


首先,您需要连接主情节提要中的 cardView 插座,当然,您已经在 ViewController 中添加了一个视图。然后在您的 CardView 类中,您必须实例化 cardContentView 插座,因为在 CardView.xib 中您没有对 cardContentView 的任何引用。确保您已在 CardContentView.xib 中连接了 backgroundView 插座。

class CardView: UIView {

    @IBOutlet weak var cardContentView: CardContentView!

    override func awakeFromNib() {
        super.awakeFromNib()
        cardContentView = Bundle.main.loadNibNamed("CardContentView", owner: self, options: nil)!.first as! CardContentView
        self.addSubview(cardContentView)
        cardContentView.layer.cornerRadius = 16

        //you can also get access to the subviews of cardContentView
        //cardContentView.backgroundView.backgroundColor = .red
    }
}


class CardContentView: UIView {

    @IBOutlet var backgroundView: UIView!

    override func awakeFromNib() {
        backgroundView.backgroundColor = .yellow
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        //commonInit()
    } 

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //commonInit()
    }

    private func commonInit() {
    }
}

推荐阅读