我创建了UIView class AView: UIView
的子类,并将UIView拖到storyboard UIViewController
界面构建器文件中,将类名更改为AView
,然后再拖动另外2 UIView
在AView分配标签10,11上。
我的问题是,当两个子视图都已创建且已初始化时?
class AView: UIView{
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print(self.subviews)
}
override func layoutSubviews() {
super.layoutSubviews()
print(self.subviews)
}
override func awakeFromNib() {
super.awakeFromNib()
print(self.subviews)
}
}
仅layoutSubviews
打印子视图。当然应该是。正如文档所说,似乎在此方法之前创建了子视图:
此方法的默认实现在iOS 5.1及更早版本中不执行任何操作。否则,默认实现使用您设置的任何约束来确定任何子视图的大小和位置。 子类可以根据需要覆盖此方法,以执行其子视图的更精确布局。仅当子视图的自动调整大小和基于约束的行为不提供所需的行为时,才应覆盖此方法。您可以使用实现直接设置子视图的框架矩形。
如果需要super.layoutSubviews()
,还有另一个问题吗?
答案 0 :(得分:0)
当加载nib文件时,首先发生的是首先加载单个对象,然后将initWithCoder发送给它们以便初始化它们。请注意,此处尚未连接对象图。这是确切的原因,如果您尝试在init中访问子视图,则您将无法找到任何子视图。 awakeFromNib被调用到此视图的情况也是如此,它只是指示视图现在已加载,但此时对象图还不需要连接。
引用有关awakeFromNib的文档 -
nib加载代码调用awakeFromNib方法的顺序 对象不保证。在OS X中,Cocoa试图调用 文件所有者的awakeFromNib方法最后但不保证 行为。如果需要在nib文件中配置对象 在加载时,最合适的时间是在你的 nib-loading调用返回。那时,所有的对象都是 创建,初始化并准备好使用。
系统调用layoutSubviews之前它可以实际呈现它们或者发现需要重新生成,这里所有对象图都将通过nib加载过程连接。因此,您可以访问此处的任何视图,并根据需要通过覆盖来定位/调整大小。在进行任何更改之前调用super.layoutSubviews非常重要。
现在提出的问题是,何时初始化所有观点并可供我访问? -