呈现 UIViewController 视图的多种方式

Multiple ways to present UIViewController's view

我是 iOS 的新手,正在处理别人的项目,我注意到似乎有多种不同的方式来呈现视图。我想知道是否有人可以简要总结呈现视图的各种方式,以及何时使用哪种方式,因为它们似乎都可以正常工作。

例如,我遇到的一段代码是这样的:

[parentView addSubview:childViewController.view];
[parentView bringSubviewToFront:childViewController.view];

使用LLDB检查childViewController,这两个return nil:

po self.parentViewController(这是零)

po self.presentingViewController(这是零)

在其他地方,我看到过这样的事情:

[parentView addSubview:childViewController.view];
[self addChildViewController:childViewcontroller];

此外,我在其他地方看到过这样的事情:

UIViewController *childViewController = [[SomeChildController alloc] init];
[self presentViewController:childViewController animated:YES completion:^(void){}];

因此,有时您可以根据需要使用父视图控制器或呈现视图控制器,而其他时候则不需要。 有这么多的选项来表达观点,你如何决定一个而不是另一个,或者哪个是正确的?

实际上只有 2 个选项可以从 ViewControllerA 显示 ViewControllerB,您使用哪个取决于您想要实现什么 -

选项 1:模态呈现

如果 ViewControllerB 应将焦点完全从 ViewControllerA 移开,直到它被关闭,请使用此选项。

[self presentViewController:viewControllerB animated:YES completion:nil];

您可以使用几种不同的 modalPresentationStyle 或创建自己的过渡。但重要的是 ViewControllerB 会将焦点从 ViewControllerA 移开,而 ViewControllerA 一次只能呈现一个视图控制器。 ViewControllerB 的 presentingViewController 将指向 ViewControllerA,而 ViewControllerA 的 presentedViewController 将指向 ViewControllerB。

UIKit 示例:UIAlertController 应该模态显示。

选项 2:视图控制器包含

如果您希望将 ViewControllerB 的视图显示为 ViewControllerA 的视图的子视图层次结构的一部分,请使用此选项。

[self addChildViewController:viewControllerB];
[self.view addSubview:viewControllerB.view];
[viewControllerB didMoveToParentViewController:self];

如果您希望 ViewControllerB 只占用 ViewControllerA 的一部分视图,或者如果您还想显示来自 ViewControllerA 的其他视图控制器的视图,请使用此技术。 ViewControllerB 的 parentViewController 将指向 ViewControllerA,而 ViewControllerA 的 childViewControllers 数组将包含 ViewControllerB。

UIKit 示例:UINavigationController 使用视图控制器包含来显示其 viewControllers