【问题标题】:iOS : Why do we need to add child view controller when adding view as subview does the work?iOS:为什么在添加视图作为子视图时我们需要添加子视图控制器?
【发布时间】:2020-02-25 01:25:43
【问题描述】:

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

【问题讨论】:

  • 你能发布一些代码吗?可能更清楚地解释了为什么你用这种方式编码? (更清晰 == 细节。)事情是这样的 - 你不需要“需要”这样做 - 这意味着有 both 视图层次结构 和 8 视图控制器之一。在某些情况下,您*应该UIViewController 中嵌入 UIView。我做。并将其变成子视图控制器。但是如果没有一些细节,就很难确切地知道你在做什么。
  • 最初,我只在 VC1 stackview 中添加了 VC2 视图并且它工作了所以我想为什么我需要添加 VC2 作为 VC1 的子控制器,我正在避免添加子控制器的过程。但是 VC2 视图有一个按钮,当用户单击时,该按钮的操作没有响应。因此,通过以下方式将 VC2 作为子视图控制器添加到 VC1 完全可以。 addChildViewController(VC2) view.addSubview(VC2.view) VC2.didMove(VC1: self)

标签: ios swift childviewcontroller stackview


【解决方案1】:

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

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

那是因为 ViewController2 本身已经死了:它已经烟消云散了。

您可以通过在 ViewController2 中实现 deinit 来看到这一点。你会看到,就像viewDidLoad 被调用一样,deinit 也是如此。你留下了一个没有视图控制器的视图控制器的视图。这很糟糕。

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

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

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


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


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

【讨论】:

  • 非常感谢您解释添加 childViewController 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
相关资源
最近更新 更多