iOS:为什么我们需要在添加视图时添加子视图控制器作为子视图工作?

You*_*raj 1 ios stackview childviewcontroller swift

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

mat*_*att 7

肯定viewDidLoad被召唤了。当您view在代码中引用 ViewController2 时,这会立即发生。

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

那是因为 ViewController2 本身已经死了:它已经消失在一股烟雾中。

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

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

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

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


(有,当你做一个视图控制器的另一个孩子,如发送其他要求didMoveToParent孩子作为开场舞的一部分,与其他的报文转发责任后沿,以确保儿童视图控制器变得像其他消息viewDidAppear在正确的时间。这是一项复杂的业务。但是,我已经将我的答案集中在您提出的问题的非常基本的部分上。)


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