如何添加一个UIViewController的视图作为子视图

请注意谷歌,这个质量保证现在是六年过时了

正如下面的Micky和其他人所提到的,现在这些工作已经在iOS平台上与Containers完成了。


我有一个控制许多子视图的ViewController。 当我点击其中一个button时,我初始化另一个视图控制器,并显示它的视图作为这个视图的子视图。 然而,子视图超出了子视图框架的边界,并且事实上充满了整个屏幕。

什么可能是错的? 我认为问题是,UIViewController的视图有一个框架(0,0,320,460),因此填充整个屏幕(虽然它只接触的触摸事件,只有在子视图范围内触摸)。 我怎样才能调整框架适合作为子视图。

总之,我需要帮助添加一个视图控制器的视图作为子视图到另一个视图控制器的视图。

谢谢!

从iOS 5开始 ,Apple现在允许您创build自定义容器 ,以便将UIViewController添加到另一个UIViewController,特别是通过addChildViewController等方法,所以确实可以嵌套UIViewControllers

编辑:包括就地总结,以避免链接断裂

我引用:

iOS提供了许多标准容器来帮助你组织你的应用程序。 但是,有时您需要创build与任何系统容器不匹配的自定义工作stream。 也许在你看来 ,你的应用程序需要一个特定的子视图控制器组织,它们之间有专门的导航手势或animation转换。 要做到这一点,你要实现一个自定义容器 – 告诉我更多…

…和:

当你devise一个容器时,你可以在你的容器,父类和其他视图控制器,它的孩子之间创build显式的父子关系 – 告诉我更多

示例(由Apple文档提供)将另一个视图控制器的视图添加到容器的视图层次结构中

- (void) displayContentController: (UIViewController*) content { [self addChildViewController:content]; content.view.frame = [self frameForContentController]; [self.view addSubview:self.currentClientView]; [content didMoveToParentViewController:self]; } 

干杯,

米奇·邓肯

感谢这个家伙,我做到了http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx

添加UIView,将其连接到标题:

 @property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot; 

在 – (void)viewDidLoad中做到这一点:

 ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil]; nonSystemsController.view.frame = self.addViewToAddPlot.bounds; [self.addViewToAddPlot addSubview:nonSystemsController.view]; [self addChildViewController:nonSystemsController]; [nonSystemsController didMoveToParentViewController:self]; 

请享用

这个答案对于旧版本的iOS是正确的,但现在已经过时了。 你应该使用Micky Duncan的答案,它涵盖了自定义容器。

不要这样做! UIViewController的意图是驱动整个屏幕。 这只是不恰当的,它并没有真正添加任何你需要的东西。

所有你需要的是拥有你的自定义视图的对象。 只需使用UIView本身的一个子类,所以它可以被添加到你的窗口层次结构中,并且内存pipe理是完全自动的。

将子视图的NIB所有者指向UIView的自定义子类。 将contentView添加到此自定义子类中,并将其指向nib中的视图。 在自定义子类中做这样的事情:

 - (id)initWithFrame: (CGRect)inFrame; { if ( (self = [super initWithFrame: inFrame]) ) { [[NSBundle mainBundle] loadNibNamed: @"NibNameHere" owner: self options: nil]; contentView.size = inFrame.size; // do extra loading here [self addSubview: contentView]; } return self; } - (void)dealloc; { self.contentView = nil; // additional release here [super dealloc]; } 

(我假设你在使用initWithFrame:构造子视图。)

我觉得所有这些答案都略有不完整,所以以下是将viewController视图添加为另一个viewController视图的子视图的正确方法:

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

如果你愿意,你可以把它复制到代码中作为一个片段。 这似乎并没有理解代码replace格式,但他们将在Xcode中显示干净:

  [self addChildViewController:<#viewControllerToAdd#>]; [self.view addSubview:<#viewControllerToAdd#>.view]; [<#viewControllerToAdd#> didMoveToParentViewController:self]; 

willMove会自动调用w / addChild。 谢谢@iOSSergey

当您的自定义容器调用addChildViewController:方法时,它会自动调用视图控制器的willMoveToParentViewController:方法,在添加之前添加为小孩。

使用:

 [self.view addSubview:obj.view]; 

更改viewcontroller.view.frame的框架大小,然后添加到子视图。 [viewcontrollerparent.view addSubview:viewcontroller.view]

您必须设置边界属性以适应该框架。 将其超视图属性进行框架化,并将界限限制在视图本身的坐标系中。