【问题标题】:Why is this View nil in awakeFromNib()? [duplicate]为什么 awakeFromNib() 中的 View 为零? [复制]
【发布时间】:2019-03-25 11:44:11
【问题描述】:

我正在练习 awakeFromNib。

我在 Main.storyboard 中有一个 UIView。 这个 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,它继承了默认的 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)
    }

}

是的,我想通过 class CardView 在 ViewController 中显示 CardContentViewcardView

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

错误行在func awakeFromNib

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

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

我不知道为什么cardContentView = nil

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

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

谢谢!

【问题讨论】:

  • 故事板不加载 xibs。
  • @Sulthan 感谢您的评论。你的意思是我需要在 ViewController 中启动“var cardView”?还是别的什么?

标签: swift awakefromnib


【解决方案1】:

首先,您需要连接主情节提要中的 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() {
    }
}

【讨论】:

  • 感谢您的评论。我根据您的建议进行了尝试,但是“此类不符合键值编码的键值背景视图。”弹出。
  • @Hoo 你可以在 CardView 类中访问 c​​ardContentView 的子视图。我编辑了答案,例如,我更改了 backgroundView 的背景颜色。那么就不需要在 CardContentView 的 commonInit 方法中实例化 backgroundView 了。
  • 感谢您的回复。但是,我想要的是在 CardContentView 中使用纯背景视图。我想将它实现到 CardView 没有任何改变。
  • @Hoo 您可以覆盖 CardContentView 类中的 awakeFromNib 方法。无需实例化 backgroundView,您就可以访问它。请参阅编辑后的答案。
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2021-06-09
  • 1970-01-01
相关资源
最近更新 更多