何时/何处UIView的子视图是从故事板初始化的?

何时/何处UIView的子视图是从故事板初始化的?

问题描述:

我创建的UIView class AView: UIView的子类,拖动一个UIView到故事情节UIViewController界面生成器文件,更改类名AView,然后我拖累AView另外2个UIView小号分配标签10,11何时/何处UIView的子视图是从故事板初始化的?

我的问题是当两个子视图都是创建的初始化

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()是必要的?

加载nib文件时,首先发生的是单个对象首先被加载,并且initWithCoder被发送给它们以便它们可以被初始化。请注意,对象图表尚未连接到此处。这是确切的原因,如果您尝试在init中访问子视图,您将找不到任何子视图。对于这个视图调用awakeFromNib的情况也是如此,这只是一个表明视图现在已经加载了,但目前还没有连接对象图。

要在awakeFromNib-

在笔尖加载代码调用awakeFromNib方法的对象的 不能保证订单报价文档。在OS X中,Cocoa尝试调用文件所有者的awakeFromNib方法 last,但不保证 行为。如果您需要在加载时进一步在您的笔尖文件 中配置对象,则最适合的时间是在您的 笔尖加载调用返回之后。那时,所有的对象都是 创建,初始化,并可以使用。

系统调用layoutSubviews之前,它可以实际呈现它们或发现需要一个reorg,在这里所有的对象图将通过笔尖加载过程连接。所以,你可以在这里访问任何视图,并通过覆盖来定位/调整它的大小。在做任何改变之前调用super.layoutSubviews非常重要。

现在来的时候正好所有的观点被初始化并供我访问的问题 -

  1. 如果我们通过视图控制器加载,然后viewDidLoad中是地方从笔尖每个对象已装入并且所有插座已连接等。
  2. 如果我们自己加载笔尖,则只有在笔尖加载调用返回后才能进行。
+0

看起来这是不正确的,即使我连接仍然打印无AView的子视图。即使我没有连接,必须有一个时间子视图被初始化,连接只是一个参考,不是吗? –