了解iOS中的View Controller嵌套

在过去的几天里,我一直在扯掉自己的头发,试图理解iOS开发这个看似基本的概念:

  • 如果我想有两个或更多的视图控制器显示和可用在同一个“屏幕”,是这样的:

    1. 根据苹果的“每个屏幕内容一个VC”
    2. 完全可能通过添加VC的通过代码
    3. 只是没有完成。 相反,使用一个VC,只需添加模拟所需视图控制器function的代码即可。

让我重新修改一下:

如果我想在iPad应用程序中拥有占据屏幕左侧很大一部分的UIView (A)和占据屏幕右侧其余部分的第二个UIView (B)我想添加一个button到UIView B,点击时将使用模式转换来向上滑动UITableview来replaceUIView B,然后这个UITableview将像一个典型的UITableviewController ,当用户从表中select一个项目时,典型的事件发送到桌面控制器推入一套新的项目,这是可能的吗?

在我看来,如果我已经能够轻松地创build两个单独的UIViewControllers,并在一个VC中有一个button模态地调出第二个VC,为什么不能组合这个function,以便一个VC有两个子VC,而那些VC处理他们自己的模式转换。

或者,在这种情况下,最好的做法是只需一个VC来处理所有事情,然后在不同的UI元素上点击各种不同的视图后,手动处理幻灯片的进出。

正如你所看到的,我认为我已经阅读了太多不同的,相互冲突的回答,类似于这个问题,我已经完全搞不清什么是什么了。 如果有人明白我在做什么,并可以借给一个帮助解释或一些指针Id非常感激。

答案取决于你是否需要支持iOS 4。 如果是的话,答案是:

答案1 – 除了苹果公司自己的容器控制器,尤其是UITabBarController,UINavigationController,UISplitViewController,UIPageViewController和UIPopoverController(我错过了吗?)没有适当的支持方式,让多个视图控制器在同一个屏幕上活动,pipe理不同的部分的观点。 ViewModalViewController等视图控制器方法都假设有一个“最前面”的视图控制器,拥有整个屏幕,如果你试图让多个视图控制器pipe理视图的不同部分,所有的东西都会例如转发屏幕旋转事件和在页面转换之后调整视图的大小/定位。

但是,如果您只需要支持iOS 5,则答案是:

答案2 – 没问题! 只要确保所有的子页面视图控制器都正确连接到pipe理整个页面的主视图控制器。 这意味着除了控制器的视图是公共父视图的子视图以外,控制器本身应该是公共父控制器的子控制器。 只要控制器的parentViewController属性都设置正确,你应该能够pipe理这种复合接口而不用太麻烦。

不幸的是,苹果只在iOS5中添加了childViewControllers和parentViewControllers的公共setter。 在iOS4和更早版本中,您仅限于苹果自己的容器控制器安排,无法自行创build(至less在没有事件转发问题的情况下)。

因此,假设您现在需要支持iOS4,那么第3个答案看起来就像是最好的select:使用多个视图构build您的界面,而只需一个控制器。 这并不是太糟糕。 您可以创build自定义视图子类来pipe理inheritance自己的子视图(例如没有规则说,tableViewDataSource或委托必须是UIViewController子类,或者buttonIBAction必须是视图控制器上的方法而不是另一个视图)。

实际上,您会发现通常构build到视图控制器中的大多数function都可以构build到“智能”容器视图中,使您可以将屏幕分割为多个独立的“控制器视图”,以pipe理其内容。

唯一有点棘手的就是在一个视图和另一个视图之间进行转换。 为此,您将无法使用标准的presentModalViewController或pushViewController方法,您必须使用CATransitions或UIViewanimation自己animation。

这在IOS 4中是绝对可能的:

你有一个视图控制器“A”,其视图:

  • Alloc初始化视图控制器“B”你想在视图控制器“A”
  • 以视图控制器“B”的视图作为参数调用(void)addSubview:(UIView *)视图控制器“A”的视图
  • 视图控制器“B”视图的框架由于addSubView而被设置为全屏,因此将其更改为将视图放置在视图控制器“A”的视图中所需的位置。
  • 添加一些UIViewanimation当你改变框架有一个很好的显示。

在IOS5上只使用视图控制器“A”上的方法:

  • (void)addChildViewController:(UIViewController *)childController

视图控制器编程指南涵盖了这一点。

视图控制器pipe理一组视图。 您可以拥有pipe理视图控制器层次结构的内容视图控制器和容器/导航视图控制器(例如:导航视图控制器可以pipe理列表视图控制器和细节控制器)。

这里有更详细的介绍:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457

视图控制器pipe理应用程序用户界面的一个独立部分。 根据请求,它提供可以显示或交互的视图。 通常,这个视图是一个更复杂的视图层次结构的根视图 – button,开关和iOS中现有实现的其他用户界面元素。 视图控制器充当此视图层次结构的中央协调代理,处理视图和任何相关控制器或数据对象之间的交换。

多个视图控制器协调他们的努力呈现一个统一的用户界面。