UIViewController 子视图存在不变

Posted

技术标签:

【中文标题】UIViewController 子视图存在不变【英文标题】:UIViewController subviews existance invariant 【发布时间】:2016-11-23 17:14:31 【问题描述】:

UIViewController 生命周期中的什么时候,self.viewsubview 属性可以保证填充所有正确的视图?注意:我不在乎它们是否布局,只是它们存在于子视图数组中。 WWDC 视频说 loadViewviewDidLoadinit 都没有提供该保证,但 viewWillLayoutSubviews 也迟到了。

我在本例中尝试执行的任务是本地化。在一个通用视图控制器类中,我想遍历所有子视图,查看它们是否有一个自定义属性集,该属性集标识哪些本地化字符串键附加到该视图,然后递归所有视图子视图,直到视图底部达到层次结构。在这种情况下,布局并不重要,只是在视图控制器中填充了子视图。

【问题讨论】:

【参考方案1】:

在 UIViewController 生命周期的哪个阶段,self.view 的子视图属性保证填充所有正确的视图

大多数应用程序实现的最早点是viewDidLoad。此时,您可以保证 self.view 与情节提要中的所有子视图一起存在,并且任何从情节提要连接到该视图控制器的出口都已被填充。

我不关心它们是否布局,只关心它们存在于子视图数组中

确实如此。 self.view 和它的 nib-loaded 子视图此时存在,但它们的布局尚未发生,它们的框架不一定正确。你不在乎,所以viewDidLoad 适合你的目的。

【讨论】:

这个怎么样? pbs.twimg.com/media/Cx4JzXvWgAASHHv.jpg Apple 的 WWDC 视频指出,在 viewDidLoad 中,视图尚未在超级视图中。这只适用于self.view 还是同样适用于self.view 的所有子视图? self.view。我没有在我的回答中说self.view 有一个superview。您询问了self.view 及其子视图,这就是我的回答。假设此时self.view 在界面中 是愚蠢的。但你假设它,所以你很好。 有趣。我想我很好奇该限制是否不仅适用于视图控制器视图,而且已经适用于子视图。很高兴知道,谢谢@matt!我问的原因是我正在尝试对从 nibs 加载的视图执行本地化,如果视图安装为常规、常规(仅限 iPad),则视图不会显示在从 loadNibNamed 返回的子视图列表中(我使用loadView 作为钩子)。我认为这可能与它有关,但如果 loadViewviewDidLoad 都具有该不变量,我想不会。 当然,这可能是与UIKit 无关的一些疯狂事件,只是应用程序本身的一个问题。想要验证并确保。 @startupthekid 我不知道在做什么或在看什么。你问了一个简单的问题,我回答了,我相信你会发现我回答正确。当然,如果条件子视图不适用于 nib 加载时的大小类情况,它不会出现在 viewDidLoad 中。事实上,它可能永远不会出现。这就是“有条件”的意思!但那是完全不同的事情。

以上是关于UIViewController 子视图存在不变的主要内容,如果未能解决你的问题,请参考以下文章

子 UIViewController 视图阻止容器 UIViewController 视图接收触摸事件

添加、删除子视图并在子视图和主 uiviewcontroller 之间进行通信

UIViewController 移除子视图

嵌入 UIViewController 比向 UIViewController 添加子视图更好(以编程方式)

UIView:将 UIViewController 的视图添加为子视图并将其删除

如何将 UIViewController 作为子视图添加到 UIViewController(RootViewController)?