我想添加一个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的特定 子 视图中?或者如何在视图控制器层次结构中没有错误的情况下实现此目的?
答案 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];
答案 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];
}