呈现 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
。
我是 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
。