使用视图控制器子视图

问题描述:

背景:使用视图控制器子视图

我有一个作为其接口的一部分标签栏,但我没有使用一个标签栏控制器的应用程序...我这样做是故意的许多因此,请不要回覆我将应用程序重新编写为标签栏控制器,因为这不会起作用。

视图控制器控制屏幕和标签等相当不错,但现在我想以一个完全不同的视图添加到应用程序。现在,是的,我可以将视图放入现有的.XIB中,然后将其所有控件放入现有的视图控制器类中,但它已经有很多事情要做,所以我想将这个视图绑定到它自己的视图控制器并通过按钮按下有效地启动。

现在,在标签栏控制器模型,添加绑定到标签中没有任何问题,一个新的视图控制器,但因为我没有使用一个标签栏控制器,我有点失落。我知道这是基本的,我只是没有看到它,但在XIB中没有办法将视图控制器添加到tabbar或tabbar项目,sicne它不是一个tabbarcontroller IB似乎不允许这样做。我可以很容易地将视图添加到IB,但是我没有将控制器绑定到它,并且需要该视图的所有控制代码也成为主控制器的一部分,我可以这样做,但愿意分离,因为该视图与其他用户交互和视图相关的所有其他功能完全不同。

那么,什么是实现这一目标的最佳方式是什么?在标签栏按下实例化ViewController,并将其视图作为子视图添加到主窗口中?我认为这将工作,但这似乎有点kludgy ..有没有其他方式来展示一个视图,并将其绑定到一个veiw控制器?

+2

观看从“实施的UIViewController遏制”视频[WWDC 2011](https://developer.apple.com/videos/wwdc/2011/)。 – 2012-07-23 19:49:59

你在最后一段提出什么工作......居多。 :-)视图控制器实际上是为了管理“一个屏幕内容”,所以如果你尝试这个,准备好卸载或重新加载视图,自动旋转和其他微妙的怪癖。你可能是明智的,按照苹果公司的视图控制器编程指南这样的建议:

注意:如果你想视图层次划分成多个子区域 并单独管理每一个,使用通用控制器对象(定制 对象降来自NSObject)而不是视图控制器对象 来管理每个分区。然后使用单个视图控制器对象 管理通用控制器对象。

+0

我认为引用来自过时的文档,[遗留视图控制器编程指南](https://developer.apple。COM /库/ IOS /#文档/ WindowsViews /概念/ ViewControllerPGforiOSLegacy/AboutViewControllers/AboutViewControllers.html)。我可能是错的,但我不认为你会在最新的[View Controller编程指南](http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/UsingViewControllersinYourApplication/UsingViewControllersinYourApplication。 HTML#// apple_ref/DOC/UID/TP40007457-CH6-SW12)。 – Rob 2012-07-23 20:53:26

+0

视图控制器遏制作为iOS 5的一部分专门用于此目的。而视图控制器必须是“屏幕内容”的概念显然是不正确的,因为如果你看看内置的视图控制器容器(导航控制器,标签栏控制器,分割视图控制器),所有这些都允许你创建你自己的“儿童”视图控制器,绝对不管理“屏幕”。 – Rob 2012-07-23 20:55:24

+0

显然,如果user282172试图支持iOS5之前版本,那么自定义视图控制器遏制不是一种选择,在这种情况下,您对旧文档的引用将适用。 – Rob 2012-07-23 20:58:32

如果您使用iOS 5的view controller containment,在viewDidLoad中,您将安装第一个视图控制器。我一般定义在我父控制器的NIB /故事板一个childView视图,这将决定在子视图放置(如果要动画过渡,并要限制动画子视图,这是尤其有用):

OneViewController *controller = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; 

[self addChildViewController:controller]; 
[controller didMoveToParentViewController:self]; 
[childView addSubview:controller.view]; 

然后,当你点击,例如,你的第二个选项卡,你要到下一个控制器,你只需调用transitionFromViewController

[self addChildViewController:newController]; 

[self transitionFromViewController:oldController 
        toViewController:newController 
          duration:0.5 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ 
          // do any other animation of the parent view that you want coordinated with the transition, e.g., I'm going to replace the nav bar title 
          [self updateTitles:newController]; 
         } 
         completion:^(BOOL finished){ 
          [oldController willMoveToParentViewController:nil]; 
          [oldController removeFromParentViewController]; 
          [newController didMoveToParentViewController:self]; 
         }]; 

显然,做这一切,你做了很多工作,重现标准标签栏控制器功能,但我认为您有充足的理由这样做。