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?
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.
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 .
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With