我对iOS很新,并且正在处理其他人的项目,我注意到呈现视图似乎有各种不同的方式。我想知道是否有人可以简要介绍一下呈现视图的各种方式,以及何时使用哪一种方式,因为它们似乎都能正常工作。
例如,我遇到的一段代码就是这样的:
[parentView addSubview:childViewController.view];
[parentView bringSubviewToFront:childViewController.view];
使用LLDB检查childViewController
,这两个都返回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){}];
因此,如果您愿意,有时您可以拥有父视图控制器或呈现视图控制器,有时则不需要它。 有这么多选择来呈现观点,你如何决定一个在另一个上面,或者哪个时候是正确的?
答案 0 :(得分:9)
实际上只有两个选项可以从ViewControllerA显示ViewControllerB,你使用它将取决于你想要实现的目标 -
如果ViewControllerB应完全从ViewControllerA开始关注,直到它被解除,请使用此方法。
[self presentViewController:viewControllerB animated:YES completion:nil];
您可以使用一些不同的modalPresentationStyle
,或者您可以创建自己的过渡。但重要的是ViewControllerB将把焦点从ViewControllerA上移开,而ViewControllerA一次只能呈现一个视图控制器。 ViewControllerB的presentingViewController
将指向ViewControllerA,ViewControllerA的presentedViewController
将指向ViewControllerB。
UIKit示例:UIAlertController
应以模态方式呈现。
如果您希望将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
。