2012-01-26 19 views
17

我一直撕裂我的头发,在过去几天试图了解这一个iOS开发的看似基本的概念:了解视图控制器嵌套在iOS版

  • 如果我想有两个或多个视图控制器在相同的“满屏”显示,并可用,是这样的:每个苹果的

  • 完全可以做到“每个内容满屏一个VC”

    1. 不可取的,因为通过添加VC通过代码
    2. 只是没有完成。相反,使用一个VC并简单地添加模拟您想要的视图控制器功能的代码。

让我重新整理了一下:

如果我想有,在iPad应用程序,一个UIView(A),占用了屏幕的左侧的大部分,并第二个UIView(B)占据了屏幕右侧的其余部分,并且我想添加一个按钮到UIView B,点击时将使用模式转换向上滑动UITableview以替换UIView B,并且此UITableview然后将像典型的UITableviewController那样工作,从而当用户从表中选择一个项目时,发送典型事件到桌面控制器推入一组新的项目,这可能吗?

在我看来,如果我已经能够轻松地创建两个单独的UIViewControllers,并且在一个VC中有一个按钮,可以调出第二个VC,为什么不能组合这个功能,以便一个VC有两个子VC,而那些儿童风险投资公司正在处理他们自己的模式转变。

或者是在这样的情况下,最好的做法只是有一个VC,处理每一件事,然后手动处理动画的幻灯片中输入/输出的各种视图上的各种UI元素的各种点击之后?

正如你所知道的,我认为香港专业教育学院读太多不同,引发冲突的香港专业教育学院得到了完全搞不清什么是什么了类似于这个问题的回答。如果有人了解我在做什么,并且可以给出帮助解释或一些指针Id非常感谢。

+0

你找到一个好办法做到这一点在iOS 5中?我想解决的问题在您的参考http://www.tumblr.com/tagged/child-view-controller中有明确的定义。它确实会很好地嵌套在主视图中的各个部分,以防止主视图变为代码繁重。 – mm2001

回答

2

视图控制器编程指南涵盖这很好。

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

它覆盖在这里更详细地:

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

视图控制器管理应用程序的 用户界面的分立部分。根据请求,它提供可以显示 或与之交互的视图。通常情况下,这种观点是对的观点更复杂 层次结构中的根视图 - 按钮,开关,并与在IOS现有实现其他用户 界面元素。视图 控制器充当该视图的中央协调代理,处理视图和任何相关的控制器或数据对象之间的交换。

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

+0

链接已死亡。 – hnh

11

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

答案1 - 除了Apple自己的容器控制器,尤其是UITabBarController,UINavigationController,UISplitViewController,UIPageViewController和UIPopoverController(我是否错过任何?),没有正确支持的方式视图控制器在同一屏幕上处于活动状态,管理视图的不同部分。 ViewModalViewController等视图控制器方法都假设有一个拥有整个屏幕的“最前面”视图控制器,如果你试图让多个视图控制器管理视图的不同部分,所有类型的东西都会诸如转发屏幕旋转事件以及在页面转换之后调整视图的大小/定位。

不过,如果你只需要支持的iOS 5,答案是:

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

不幸的是,Apple仅在iOS5中为childViewControllers和parentViewControllers添加了公共setter。在iOS4和更早版本中,您仅限于Apple自己的容器控制器安排,无法创建自己的(至少,并非没有事件转发问题)。

因此,假设您现在需要支持iOS4,那么第3个答案看起来就像是您最好的选择:使用多个视图构建您的界面,但只有一个控制器。尽管如此,这还不算太坏。您可以创建自定义视图子类来管理继承自己的子视图(例如,没有规则说tableViewDataSource或delegate必须是UIViewController子类,或者按钮IBAction必须是视图控制器上的方法而不是另一个视图)。

实际上,您会发现通常构建到视图控制器中的大多数功能都可以构建到“智能”容器视图中,从而允许将屏幕分割为多个独立的“控制器视图”拥有内容。

唯一有点棘手的是做一些视图和下一个之间的转换。为此,您将无法使用标准的presentModalViewController或pushViewController方法,您必须使用CATransitions或UIView动画自己动画。

+0

是的,我观看了WWDC视频,讨论视图控制器如何拥有父视图控制器和子视图控制器,但是与大多数WWDC视频一样,它们倾向于略过这些和那里的一些细节。这虽然有帮助。 是否可以通过IB做到这一点?尽管我尝试努力,但我似乎无法弄清楚如何通过IB在同一个屏幕上显示两个VC,它总是为每个我拖出的VC创建一个新屏幕。 –

+1

我发现这个网站有一些关于这个主题的更好的解释:http://www.tumblr.com/tagged/child-view-controller,尽管它解释了你必须以编程方式添加childViewControllers,并且也以编程方式定位它们。如果有人知道,我希望能通过IB添加和定位这些控制器。 –

+1

我不认为你可以在IB中做到这一点。你可以做的是在IB中设置视图控制器的根视图的大小,方法是将状态栏设置为“none”,这将取消禁用检查器中的宽度/高度控件。然后,您可以将IB中每个子视图的布局设计为单独的笔尖,然后将代码中的视图控制器粘合在一起,如果您只有一个或两个屏幕,这应该不会太糟糕。 –

3

这是明确可能在IOS 4:

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

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

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

  • (无效)addChildViewController:(UIViewController的*)childController