从一个UIViewControllerpipe理多个UIViews

我对视图控制器感到困惑,并会喜欢一个直接的例子。 这是序言:

我有一个匹配.xib的UIViewController。 默认情况下,IB在“文档”窗口中给我一个单独的视图。 我可以通过告诉我的UIWindow addSubview:controller.viewbringSubviewToFront:controller.view

以下是问题:

  1. 我应该添加另一个视图到在IB的ViewController? 还是有一个更好的,程序化的方式?

  2. 我如何告诉ViewController在视图之间切换?

  3. 从ViewController向下,代码看起来像做什么?

我正在尝试的东西,但只是弄得一团糟,所以我想我会停下来问问…

请注意,您的主视图控制器中的每个button,标签,图像等实际上都是一个视图,但是我已经将您的问题解释为意味着您要pipe理多个全屏视图或“屏幕”。 每个屏幕应该有自己的视图控制器来pipe理它。 所以为了让术语正确,一个视图控制器是一个pipe理单个全屏视图的对象(或者如果嵌套在导航控制器或者标签栏控制器中,几乎是全屏的),而视图是pipe理的大区域视图控制器以及其中的所有子视图(图像,button,标签等)(它们都是UIView子类)。 视图控制器pipe理所有的屏幕上,如果你想要另一个屏幕/页面,那么你应该创build一个新的视图控制器来pipe理它。

根视图控制器(您添加到窗口的控制器)可以是您在IB中devise的普通视图控制器,但是如果您使用导航控制器或选项卡栏控制器并添加您的devise视图控制器 – 那么你可以根据需要推送额外的视图控制器。

另一种方式(如果你不想要导航或标签栏风格)将转换到其他视图控制器直接在主窗口使用任何你喜欢的过渡(或只是replace旧的)。 我们现在就离开这个了。

你的主视图控制器(你在IB中devise的那个)的任何子视图都将从nib文件中自动加载,但是如果你愿意,你也可以用编程方式添加你自己的视图(通常你会使用其中一个,即笔尖编程,但你可以混合和匹配,如果你想)。 要以编程方式执行,请在视图控制器中重写loadView ,然后调用[super loadView]; 然后做[self.view addSubView:myOtherView]; (当然首先创buildmyOtherView )。 注意,第一次.view是在你的视图控制器上访问,它实际上调用loadView来创build视图,所以在loadView中调用[super loadView];是很重要的[super loadView]; 在尝试访问self.view之前:D

要在视图之间切换,使用导航或标签栏控制器使其变得非常容易。 所以把你的主视图控制器(例如)一个导航控制器,并把导航控制器在窗口,所以你有window-> navigationController-> myController。 然后从视图控制器中的一个操作方法(你可以在IB中连接操作方法),例如当按下“about”button时,执行以下操作:

 - (void)doAbout { // Create the about view controller AboutViewController* aboutVC = [AboutViewController new]; // Push the view controller onto the navigation stack [self.navigationController pushViewController:aboutVC animated:YES]; [aboutVC release]; } 

请注意,关于视图控制器是在这里以编程方式创build的 – 如果您的视图是在IB中devise的,那么请使用initWithNibName:bundle:来创build它。

这就是你如何pipe理多个屏幕。