呈现 ViewController 与添加 ViewController 作为 child 有什么区别

What is the difference between presenting a ViewController vs adding a ViewController as a child

我刚刚读了一篇 interesting article,它向我介绍了一个我以前从未听说过的新概念,即添加一个 ViewController 作为另一个 [=15= 的 child ].本文使用 UIActivityIndicatorView 作为示例来演示何时使用 addChild 方法的常见用法,这让我想知道为什么你会使用该方法而不是仅仅呈现视图控制器。

我不完全理解的部分是使用该特定方法的好处,因为作为 child 呈现和添加都可以以可重复使用的方式模块化。

你什么时候会使用 addChild 而不是仅仅展示它?这什么时候有意义?

添加孩子:

let parent = UIViewController()
let child = MyViewController()

parent.view.addSubview(child.view)
parent.addChild(child)
child.didMove(toParent: parent)

现在:

let storyboard : UIStoryboard = UIStoryboard(name: "StoryboardName", bundle:nil)
let myVC  = storyboard.instantiateViewController(withIdentifier: "myViewController") as! MyViewController
self.present(myVC , animated: true, completion: nil)

很简单。 addChild is when you want to embed the view controller in you parent view controller (you will also need to follow up with a view.addSubview(child.view)). present 是您想要展示它的时候...可以将其视为换屏。

addChild:

present:

不同之处在于,当您呈现控制器时,它会变成模态,而当您将其添加为 child 控制器时,它不会。区别在于语义和用例。

模态

作为模态 window 的示例,想象一下 window 在 macOS 中带有一个确定按钮,它会阻止您与 parent window 交互,直到您关闭它.

因此,为什么一个特定的控制器只能呈现一个视图控制器:呈现的控制器成为用户交互的“主要”,用户必须将其关闭到 return 到 parent window.

模态 window 的典型示例是警报。

Child

但是 child 视图控制器是另一回事。在特定的 VC.

上可以有任意数量的它们

parent 控制器成为 child 视图控制器的容器。例如,可以有一个包含多个面板的仪表板,每个面板可以是一个单独的控制器。这允许在应用程序的不同部分之间分离逻辑,而不是将所有内容都塞进一个控制器中,以简单的方式实现用户定制等。

parent-child 控制器交互的典型示例是 UINavigationController:导航控制器是 parent,所有推入其中的视图控制器都是它的 children .我们不会把整个应用的逻辑做成一个uber controller,我们在不同的screen之间分离,navigation controller只负责展示。