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?
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
//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
To show a child_view_controller over a main_view_controller.
step 1: create a main_view_controller in storyboard.
step 2: create a child_view_controller with a UIview and some Label inside in storyboard.
step 3: in main_view_controller's button action add the following code:
- (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];
}