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

时间:2015-10-15 08:40:55

标签: ios swift

我创建了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(),还有另一个问题吗?

1 个答案:

答案 0 :(得分:0)

当加载nib文件时,首先发生的是首先加载单个对象,然后将initWithCoder发送给它们以便初始化它们。请注意,此处尚未连接对象图。这是确切的原因,如果您尝试在init中访问子视图,则您将无法找到任何子视图。 awakeFromNib被调用到此视图的情况也是如此,它只是指示视图现在已加载,但此时对象图还不需要连接。

引用有关awakeFromNib的文档 -

  

nib加载代码调用awakeFromNib方法的顺序   对象不保证。在OS X中,Cocoa试图调用   文件所有者的awakeFromNib方法最后但不保证   行为。如果需要在nib文件中配置对象   在加载时,最合适的时间是在你的   nib-loading调用返回。那时,所有的对象都是   创建,初始化并准备好使用。

系统调用layoutSubviews之前它可以实际呈现它们或者发现需要重新生成,这里所有对象图都将通过nib加载过程连接。因此,您可以访问此处的任何视图,并根据需要通过覆盖来定位/调整大小。在进行任何更改之前调用super.layoutSubviews非常重要。

现在提出的问题是,何时初始化所有观点并可供我访问? -

  1. 如果我们通过视图控制器加载,那么viewDidLoad就是加载了来自nib的每个对象并连接所有插座等的地方。
  2. 如果我们自己加载笔尖,则只有在nib加载调用返回后才会加载。