将子视图控制器的视图添加到父视图控制器的子视图

时间:2013-06-09 16:15:40

标签: ios addsubview parentviewcontroller container-view childviewcontroller

我想添加一个tableViewController作为containerViewController的子视图控制器(如下所示)。根据Apple的View Controller Programming Guide,我可以通过我的containerViewController中的以下代码行来实现这一点:

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

事实上,这很好。现在的问题是我不想将tableViewController的视图添加为containerViewController的根视图的子视图。相反,我想将它添加为containerView的子视图(参见图像),它本身是containerViewController的根视图的子视图。所以我改变了上面的代码如下:

   [self addChildViewController:tableViewController];
   [self.contentView addSubview:tableViewController.view];
   [tableViewController didMoveToParentViewController:self];

现在,当我启动应用程序时,它立即崩溃并出现此错误:

  

由于未捕获的异常'UIViewControllerHierarchyInconsistency'而终止应用程序,原因:'子视图控制器:应该有父视图控制器:但实际的父级是:'

这是什么问题?是否无法将childViewController的视图添加到其containerViewController的特定 视图中?或者如何在视图控制器层次结构中没有错误的情况下实现此目的?

containerViewController

3 个答案:

答案 0 :(得分:48)

将viewController添加到哪个视图并不重要。如果将viewController的视图添加到另一个viewController,则需要正确设置它。

tableViewController.view.frame = self.contentView.bounds;
[self.contentView addSubview:tableViewController.view];
/*Calling the addChildViewController: method also calls 
the child’s willMoveToParentViewController: method automatically */
[self addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:self];

Source code

答案 1 :(得分:1)

//class name InfoViewController

IBOutlet UIView *addViewToAddPlot;
InfoViewController *InfoController;

-(void) add_method
{
    InfoController = [[InfoViewController alloc] initWithNibName:@"InfoViewController" bundle:nil];
    InfoController.view.frame = self.addViewToAddPlot.bounds;

    [self containerAddChildViewController:InfoController];
}

-(void) remove_method
{
    [self containerRemoveChildViewController : InfoController];
}

- (void)containerAddChildViewController:(UIViewController *)childViewController {

    [self addChildViewController:childViewController];
    [self.addViewToAddPlot addSubview:childViewController.view];
    [childViewController didMoveToParentViewController:self];

}

- (void)containerRemoveChildViewController:(UIViewController *)childViewController {

    [childViewController willMoveToParentViewController:nil];
    [childViewController.view removeFromSuperview];
    [childViewController removeFromParentViewController];

}

添加和删除viewcontroller,#childviewcontroller

答案 2 :(得分:1)

通过main_view_controller显示child_view_controller。

第1步:在故事板中创建一个main_view_controller。

第2步:在故事板中创建一个带有 UIview和中的一些标签的child_view_controller。

第3步:在main_view_controller的按钮操作中添加以下代码:

- (IBAction)YourButtonAction:(id)sender {
    ChildViewControllerName *childViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"storyboardIdYouProvided"];
    childViewControllerName.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
    [self.view addSubview:childViewControllerName.view];
    [childViewControllerName didMoveToParentViewController:self];
}