Swift UITableViewCell子类返回nil

Swift UITableViewCell子类返回nil,swift,uitableview,Swift,Uitableview,我已从storyboard中设置了一个UITableViewCell子类,并将子视图连接为IBOutlets,您可以在此处查看: public class WaitingStatusTableViewCell: UITableViewCell { @IBOutlet weak var leftBoxView: UIView! @IBOutlet weak var leftTimeLabel: UILabel! @IBOutlet weak var leftTitleLabel: UILabel

我已从storyboard中设置了一个UITableViewCell子类,并将子视图连接为IBOutlets,您可以在此处查看:

public class WaitingStatusTableViewCell: UITableViewCell {

@IBOutlet weak var leftBoxView: UIView!
@IBOutlet weak var leftTimeLabel: UILabel!
@IBOutlet weak var leftTitleLabel: UILabel!
覆盖了初始化器:

 override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.initialConfigure()
}

required public init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.initialConfigure()
}
在initialConfigure函数中,我尝试配置子视图的一些属性

    func initialConfigure() {
    self.leftBoxView.backgroundColor = UIColor.clearColor()
    self.leftBoxView.layer.shadowColor = UIColor.darkGrayColor().CGColor
    self.leftBoxView.layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: 12.0).CGPath
    self.leftBoxView.layer.shadowOffset = CGSize(width: 2.0, height: 2.0)
    self.leftBoxView.layer.shadowOpacity = 1.0
    self.leftBoxView.layer.shadowRadius = 2
    self.leftBoxView.layer.masksToBounds = true
    self.leftBoxView.clipsToBounds = false
}
它根本不起作用,我收到以下错误:

致命错误:在展开可选值时意外发现nil

有什么想法吗


哦,顺便说一句,它在drawsRect函数上工作,但我真的想了解“为什么”

这一切都归结到执行顺序:

以下是加载视图时按顺序出现的关键时刻:

  • 在表视图子类上调用
    init()
    ,并创建该类的实例。此时,所有IBO出口均为
    nil
    。这就是为什么你会犯这个错误
  • 场景的其他子视图将被初始化,iBouts将被链接并指定值,您的实例将添加到视图层次中
  • 然后调用
    awakeFromNib()
    ,此时您的IBOutlets将不再具有
    nil
    值,只要它们已通过故事板正确链接
  • 当视图准备好绘制到屏幕时,最后调用
    drawRect()
因此,解决方案是将
self.initialConfigure()
移动到
awakeFromNib
方法中:

override func awakeFromNib() {
    super.awakeFromNib()
    self.initialConfigure()
}
相信iOS会发挥它的魔力


,如果您想了解更多有关此主题的信息。

哦,谢谢!成功了!顺便问一下,调用super.awakeFromNib()不是一个很好的做法吗?是的,绝对是。参考资料:很好。我编辑了我的答案。