gpt4 book ai didi

ios - UIView 的 subview 何时/何处从 Storyboard初始化?

转载 作者:行者123 更新时间:2023-11-30 13:59:40 24 4
gpt4 key购买 nike

我创建了 UIView 的子类 class AView: UIView 并将 UIView 拖到 Storyboard UIViewController 界面构建器文件中,将类名称更改为 AView,然后我在 AView 上拖动另外 2 个 UIView 并分配标签 10、11。

我的问题是两个 subview 是什么时候创建初始化的?

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 打印 subview 。当然应该如此。正如文档所说, subview 似乎是在此方法之前创建的:

The default implementation of this method does nothing on iOS 5.1 and earlier. Otherwise, the default implementation uses any constraints you have set to determine the size and position of any subviews. Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.

另一个问题是否需要super.layoutSubviews()

最佳答案

加载 nib 文件时,首先会加载各个对象,并将 initWithCoder 发送给它们,以便可以初始化它们。请注意,这里尚未连接对象图。这就是确切的原因,如果您尝试访问 init 中的 subview ,您将找不到任何 subview 。调用该 View 的 awakeFromNib 的情况也是如此,它只是表明 View 现在已加载,但此时对象图还不需要连接。

引用 awakeFromNib 的文档-

The order in which the nib-loading code calls the awakeFromNib methods of objects is not guaranteed. In OS X, Cocoa tries to call the awakeFromNib method of File’s Owner last but does not guarantee that behavior. If you need to configure the objects in your nib file further at load time, the most appropriate time to do so is after your nib-loading call returns. At that point, all of the objects are created, initialized, and ready for use.

系统在实际呈现布局 subview 或发现需要重新组织之前调用layoutSubviews,这里所有对象图都将通过 Nib 加载过程连接起来。因此,您可以在此处访问任何 View ,并根据需要通过覆盖来定位/调整其大小。在进行任何更改之前调用 super.layoutSubviews 非常重要。

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

  1. 如果我们通过 View Controller 加载,那么 viewDidLoad 就是加载 nib 中的每个对象并连接所有 socket 等的地方。
  2. 如果我们自己加载 Nib ,则只有在 Nib 加载调用返回后才会加载。

关于ios - UIView 的 subview 何时/何处从 Storyboard初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com