何时将子视图从情节提要添加到超级视图?

Posted

技术标签:

【中文标题】何时将子视图从情节提要添加到超级视图?【英文标题】:When will subviews being added to super view from storyboard? 【发布时间】:2016-04-19 07:23:53 【问题描述】:

我从情节提要中创建了一个控制器,其中包含一个 tableView。

我编译运行后会显示tableView,但是当我在viewDidLoad方法中使用self.view.subviews获取它的子视图时,却找不到tableView。

另外,我尝试在viewDidLoad中执行[self.tableView removeFromSuperview]方法,但是tableView最后还是会显示出来。

viewDidLoad 执行时,tableView 似乎还没有添加超级视图。但是,在故事板创建的另一个控制器中,我可以在 viewDidLoad 中使用 self.view.subviews 获取 tableView ...

我想知道是什么导致了这种情况以及何时添加 tableView。

【问题讨论】:

当我在 viewDidAppear 中使用 self.view.subviews 时,两个控制器都返回给我 tableView,但为什么不在 viewDidLoad 中? 在检查 tableView 的状态之前,你是否在 viewDidLoad 中调用了 super? 你好,你是在 IB vc 课上连接的吗?请检查您是否做对了。 @AliBeadle 你是什么意思?? @wkx 我想知道视图的 viewDidLoad 价格的某些部分是否需要出现才能完成添加 tableView。我不确定,所以这不一定是一个答案,但如果你还没有,请尝试在 viewDidLoad 重载开始时调用 super.viewDidLoad。 【参考方案1】:

忽略我的评论,我不认为调用 super 是答案(尽管它仍然是普遍的好习惯)。

文档不清楚,但在 viewDidLoad 中您似乎唯一可以依赖的是视图本身已加载,而不是它的任何子视图,正如您所发现的那样,它可能会也可能不会。

如果您确实需要访问子视图,它们保证会出现在 viewDidLayoutSubviews 中,如this SO answer 中所述,但请注意,每当布局子视图时都会调用它,在典型情况下会多次调用应用生命周期(例如,当用户旋转他们的设备时它也会被调用)。

如果您确实需要在加载后立即访问子视图,您可以将其子类化并覆盖其自己的 viewDidLoad 方法。

【讨论】:

以上是关于何时将子视图从情节提要添加到超级视图?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 不适用于情节提要

如何仅使用情节提要使 UILabel 的 UIView 超级视图适合 UILabel 的固有高度?

将子视图控制器链接到情节提要中的父视图控制器

使用情节提要在 UItableview 上浮动按钮

以编程方式使用自动布局将子视图添加到 UICollectionView 不起作用

推送视图控制器不显示从情节提要添加的元素