提供UIViewController视图的多种方法

时间:2015-06-15 15:57:02

标签: ios objective-c uiview uiviewcontroller

我对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){}];

因此,如果您愿意,有时您可以拥有父视图控制器或呈现视图控制器,有时则不需要它。 有这么多选择来呈现观点,你如何决定一个在另一个上面,或者哪个时候是正确的?

1 个答案:

答案 0 :(得分:9)

实际上只有两个选项可以从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