UITableViewCell子类IBOutlets返回nil

Rod*_*ici 2 uitableview swift

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

public class WaitingStatusTableViewCell: UITableViewCell {

@IBOutlet weak var leftBoxView: UIView!
@IBOutlet weak var leftTimeLabel: UILabel!
@IBOutlet weak var leftTitleLabel: UILabel!
Run Code Online (Sandbox Code Playgroud)

覆盖了初始化者:

 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()
}
Run Code Online (Sandbox Code Playgroud)

在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
}
Run Code Online (Sandbox Code Playgroud)

它根本不起作用,我收到以下错误:

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

有任何想法吗?

哦,顺便说一下,它适用于drawRect函数,但我真的想了解"为什么"

jpe*_*erl 7

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

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

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

所以,解决方案是self.initialConfigure()进入awakeFromNib方法:

override func awakeFromNib() {
    super.awakeFromNib()
    self.initialConfigure()
}
Run Code Online (Sandbox Code Playgroud)

并相信iOS将发挥其魔力.

这篇文章详细介绍了创建视图时发生的事件顺序,如果您想了解有关该主题的更多信息.