gpt4 book ai didi

iOS : Why do we need to add child view controller when adding view as subview does the work?

转载 作者:行者123 更新时间:2023-12-05 09:11:12 26 4
gpt4 key购买 nike

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

最佳答案

当然 viewDidLoad 被调用了。一旦您在代码中引用 ViewController2 的 view,这种情况就会立即发生。

但假设您的 ViewController2 除了加载 View 之外还做其他事情。假设它的 View 包含一个按钮,该按钮通过一个操作挂接到 ViewController2 中的一个函数。如果你现在点击那个按钮,什么也不会发生。

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

您可以通过在 ViewController2 中实现 deinit 来看到这一点。您会看到,正如调用 viewDidLoad 一样,deinit 也是如此。您留下了一个没有 View Controller 的 View Controller View 。这很糟糕。

有一个 View Controller 层次结构负责维护 View Controller 之间的关系。当您将 ViewController2 添加为 ViewController1 的 subview Controller 时,您维护了该层次结构,并且您根据规则正确地维护它,即:

If VC2's view is somewhere inside VC1's view, then VC2 needs to be a child (at some depth) of VC1.

换句话说, View 层次结构和 View Controller 层次结构必须一起运行。否则,响应链就会断裂,生活就会变得困惑。


(当您使一个 View Controller 成为另一个 View Controller 的 subview Controller 时,还有其他要求,例如将 didMoveToParent 作为开场舞的一部分发送给 subview Controller ,以及稍后的其他消息转发职责,以便确保 subview Controller 在正确的时间收到其他消息,如 viewDidAppear。这是一项复杂的业务。但是,我的回答集中在你所问的最基本的部分。)


我应该补充:如果您的目标只是从 nib 中获取一个 view 并将其填充到您自己的 view 中,您当然可以做到这一点,没问题。如果您打算放开 View Controller 本身,则不得将 View Controller 用作一种磁铁或真空吸尘器来为您获取 View 。

关于iOS : Why do we need to add child view controller when adding view as subview does the work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60386287/

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