多种方式展示UIViewController的视图

3
我是一个相对新手的iOS开发者,正在处理别人的项目。我注意到似乎有各种不同的方法来展示视图。我想知道是否有人可以简要概述一下各种展示视图的方式,以及何时使用哪种方式,因为它们都似乎可以很好地工作。
例如,我遇到的一段代码做了这样的事情:
[parentView addSubview:childViewController.view];
[parentView bringSubviewToFront:childViewController.view];

使用LLDB检查childViewController,这两个命令都返回nil: po self.parentViewController (这是nil) po self.presentingViewController (这是nil)
在其他地方,我看到过类似的内容:
[parentView addSubview:childViewController.view];
[self addChildViewController:childViewcontroller];

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

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

有时您可以拥有一个父视图控制器或呈现视图控制器(如果您希望),而其他时候则不需要。 有这么多选项来呈现视图,您如何决定其中一种,或在何时使用哪种?


1
我认为这里的混淆在于呈现视图和它们呈现顺序之间的区别。addSubview将视图添加到视图列表的末尾。这意味着它们将按照添加的顺序进行分层,详情请参见https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.htmlbringSubviewToFront和presentViewController操作视图的位置。 - Vincent F
1
你正在设计视图控制器的架构。你的工作是想出一个合适的架构。Cocoa包括一些内置的父视图控制器,可以帮助处理常见的架构结构,或者你也可以自己构建。做最适合用户的事情。请参阅我的书:http://www.apeth.com/iOSBook/ch19.html - matt
@vfaller...我对为什么每种技术都可以有效地呈现视图供用户使用感到困惑。例如,如果添加子视图和presentViewController一样有效,那么你为什么需要使用presentViewController呢? - Logicsaurus Rex
1
@user3055655:你使用的工具取决于你想要实现什么(包括根本不编写代码)。请注意,你的第一个代码片段可能是错误的,因为它没有正确地维护视图控制器对象图(这取决于你在片段中留下了哪些代码)。如果你还没有这样做,你必须阅读iOS视图控制器编程指南(https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html)。这应该回答你大部分关于“为什么使用视图控制器?”的问题。 - Robotic Cat
1个回答

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:视图控制器包含

如果您希望在ViewControllerA的子视图层次结构中显示ViewControllerB的视图,则可以使用此选项。

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

如果您希望ViewControllerB仅占用ViewControllerA视图的一部分,或者想要从ViewControllerA中显示其他视图控制器的视图,则可以使用此技术。 ViewControllerB的parentViewController将指向ViewControllerA,ViewControllerA的childViewControllers数组将包含ViewControllerB。
UIKit示例:UINavigationController使用视图控制器包含来显示其viewControllers。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接