我从故事板中设置了一个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函数,但我真的想了解"为什么"
这一切都归结为执行顺序:
以下是加载视图时按顺序发生的关键时刻:
init()在您的表视图子类上调用,并创建该类的实例.这时所有IBOutlets都是nil.这就是你得到这个错误的原因.awakeFromNib()然后被调用,此时你的IBOutlets将不再具有nil价值,只要它们通过故事板正确链接.drawRect() 当视图准备好被绘制到屏幕时,最后调用所以,解决方案是self.initialConfigure()进入awakeFromNib方法:
override func awakeFromNib() {
super.awakeFromNib()
self.initialConfigure()
}
Run Code Online (Sandbox Code Playgroud)
并相信iOS将发挥其魔力.
这篇文章详细介绍了创建视图时发生的事件顺序,如果您想了解有关该主题的更多信息.
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |