我已从故事板中设置了一个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函数,但我真的很想理解“为什么”
答案 0 :(得分:7)
这一切都归结为执行顺序:
以下是加载视图时按顺序发生的关键时刻:
init()
,并创建该类的实例。此时所有IBOutlets都是nil
。这就是您收到此错误的原因。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,如果您想了解更多有关此主题的信息。