30

我想添加一个 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 的特定视图中吗?或者我怎样才能在视图控制器层次结构中没有错误的情况下实现这一点?

容器视图控制器

4

3 回答 3

49

将子 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];

源代码

于 2013-06-09T17:46:46.983 回答
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];
}
于 2016-08-31T13:10:50.797 回答
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];

}

添加和删​​除视图控制器,#childviewcontroller

于 2016-06-01T07:00:46.273 回答