Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a child view controller's view to a subview of the parent view controller

I want to add a tableViewController as a child view controller of a containerViewController (shown below). According to Apple's View Controller Programming Guide I can achieve this by the following lines of code inside my containerViewController:

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

In fact, that works fine. Now the problem is that I do not want to add the tableViewController's view as a subview of the containerViewController's root view. Instead I want to add it as a subview of the containerView (see image) which itself is a subview of the containerViewController's root view. So I changed the above code as follows:

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

Now when I launch the app it crashes immediately with this error:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller: should have parent view controller: but actual parent is:'

What is the problem here? Is it not possible to add a childViewController's view to a specific sub view of its containerViewController? Or how can I achieve this without an error in the view controller hierarchy?

containerViewController

like image 877
Mischa Avatar asked Jun 09 '13 16:06

Mischa


People also ask

What is a child view controller?

Adding and removing child view controllers ensures that the parent view controller knows of its children. This will help when doing things like calling a modal from a child view that has been added to the parent. This behavior can be buggy if the parent doesn't know that it's connected to the child.

How do I add a view controller to my navigation controller?

Step 1: Embed root view controller inside a navigation controller. In your storyboard, select the initial view controller in your hierarchy. With this view controller selected, choose the menu item Editor -> Embed In -> Navigation Controller .


2 Answers

It doesn't really matter which view you are adding the child viewController to. If a view of a viewController is added to another viewController you need set it properly.

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

like image 155
Anupdas Avatar answered Sep 20 '22 12:09

Anupdas


//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];  } 

Add and remove viewcontroller ,#childviewcontroller

like image 29
Manjeet Avatar answered Sep 23 '22 12:09

Manjeet