首页 > 解决方案 > iOS:为什么在添加视图作为子视图时我们需要添加子视图控制器?

问题描述

有一个 ViewController1 有一个 stackView。我创建了 ViewController2 的一个实例并将其视图作为子视图添加到 ViewController1 的 stackView 中,我想看看是否只有这样做才会调用 ViewController2 的 viewDidLoad 并且它这样做了,当我将 ViewController2 的视图添加到时调用了 ViewController2 viewDidLoad ViewController1 的 stackView。例如:在 ViewController1self.stackView.addArrangedSubView(viewControler2.view) 那么为什么我们需要做 addChild(viewController2) 然后添加视图作为子视图,那些添加 childController 的典型行和它在父视图控制器层次结构中的视图

标签: iosswiftchildviewcontrollerstackview

解决方案


肯定viewDidLoad是被叫了。只要您view在代码中引用 ViewController2,就会立即发生这种情况。

但是,假设您的 ViewController2 除了加载视图之外还做其他事情。假设它的视图包含一个按钮,该按钮通过一个动作连接到 ViewController2 中的一个函数。如果您现在点击该按钮,则不会发生任何事情。

那是因为 ViewController2 本身已经死了:它已经化为乌有。

deinit您可以通过在 ViewController2中实现来看到这一点。你会看到,正如viewDidLoad被称为,所以是deinit。你留下了一个没有视图控制器的视图控制器的视图。那很不好。

有一个视图控制器层次结构负责维护视图控制器之间的关系。当您将 ViewController2 添加为 ViewController1 的子视图控制器时,您会维护该层次结构,并根据规则正确维护它,即:

如果 VC2 的视图位于 VC1 的视图内,则 VC2 必须是 VC1 的子节点(在某个深度)。

换句话说,视图层次结构和视图控制器层次结构必须一起运行。否则,响应者链将断裂,生活将变得混乱。


(当你让一个视图控制器成为另一个视图控制器的孩子时,还有其他要求,比如didMoveToParent作为开场舞的一部分发送给孩子,以及稍后的其他消息转发职责,以确保子视图控制器获得其他消息viewDidAppear,如正确的时间。这是一项复杂的业务。但是,我的回答集中在您所问问题的最基本部分。)


我应该补充一点:如果您的目标只是从 nib 中获取视图并将其填充到您自己的视图中,那么您当然可以这样做,没问题。如果你的意图是放开视图控制器本身,你不能做的是使用视图控制器作为一种磁铁或吸尘器来为你获取视图。


推荐阅读