UITableViewCell子类IBOutlets返回nil

时间:2015-06-25 14:00:11

标签: swift uitableview

我已从故事板中设置了一个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

有什么想法吗?

哦,顺便说一下,它适用于drawRect函数,但我真的很想理解“为什么”

1 个答案:

答案 0 :(得分:7)

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

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

    在您的表视图子类上调用
  • init(),并创建该类的实例。此时所有IBOutlets都是nil。这就是您收到此错误的原因。
  • 初始化场景的其他子视图,链接IBOutlet并分配值,并将您的实例添加到视图层次结构中。
  • 然后调用
  • awakeFromNib(),此时您的IBOutlets将不再具有nil值,只要它们通过故事板正确链接即可。
  • drawRect()在视图准备好绘制到屏幕时最后调用

因此,解决方案是将self.initialConfigure()移至awakeFromNib方法:

override func awakeFromNib() {
    super.awakeFromNib()
    self.initialConfigure()
}

并相信iOS会发挥其魔力。

Here is an excellent article detailing the sequence of events that occur when a view is created,如果您想了解更多有关此主题的信息。