提供UIViewController视图的多种方法

Log*_*Rex 3 objective-c uiviewcontroller uiview ios

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

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

[parentView addSubview:childViewController.view];
[parentView bringSubviewToFront:childViewController.view];
Run Code Online (Sandbox Code Playgroud)

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

po self.parentViewController (这是零)

po self.presentingViewController (这是零)

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

[parentView addSubview:childViewController.view];
[self addChildViewController:childViewcontroller];
Run Code Online (Sandbox Code Playgroud)

更进一步,在其他地方我见过这样的事情:

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

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

joh*_*gan 9

实际上只有两个选项可以从ViewControllerA显示ViewControllerB,你使用它将取决于你想要实现的目标 -

选项1:模态演示

如果ViewControllerB应该完全关注ViewControllerA,直到它被解除,请使用此方法.

[self presentViewController:viewControllerB animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

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];
Run Code Online (Sandbox Code Playgroud)

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

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