UITableViewCell子类IBOutlets返回nil

我已经从故事板中创建了一个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()并创建该类的一个实例。 目前所有的IBOutlets都是nil 。 这就是你得到这个错误的原因。
  • 初始化场景的其他子视图,将IBOutlet链接起来并分配值,并将实例添加到视图层次结构中。
  • 然后调用awakeFromNib() ,此时,只要已通过故事板正确链接,IBOutlet将不再具有nil值。
  • 当视图准备好被绘制到屏幕上时,最后调用drawRect()
  • 因此,解决方案是将self.initialConfigure()移动到awakeFromNib方法中:

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

    并相信iOS会发挥它的魔力。

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

    链接地址: http://www.djcxy.com/p/87743.html

    上一篇: UITableViewCell subclass IBOutlets returns nil

    下一篇: UITableView from Storyboard is always nil