Je veux ajouter un tableViewController en tant que contrôleur de vue enfant d'un containerViewController (illustré ci-dessous). Selon Apple View Controller Programming Guide Je peux y parvenir par les lignes de code suivantes dans mon containerViewController:
[self addChildViewController:tableViewController];
[self.view addSubview:tableViewController.view];
[tableViewController didMoveToParentViewController:self];
En fait, cela fonctionne bien. Maintenant, le problème est que je ne veux pas ajouter la vue tableViewController en tant que sous-vue de la vue racine containerViewController. Au lieu de cela, je veux l'ajouter en tant que sous-vue du containerView (voir l'image) qui elle-même est une sous-vue de la vue racine du containerViewController. J'ai donc changé le code ci-dessus comme suit:
[self addChildViewController:tableViewController];
[self.contentView addSubview:tableViewController.view];
[tableViewController didMoveToParentViewController:self];
Maintenant, lorsque je lance l'application, elle se bloque immédiatement avec cette erreur:
Arrêt de l'application en raison d'une exception non interceptée 'UIViewControllerHierarchyInconsistency', raison: 'contrôleur de vue enfant: devrait avoir le contrôleur de vue parent: mais le parent réel est:'
Quel est le problème ici? N'est-il pas possible d'ajouter une vue childViewController à une vue spécifique sub de son containerViewController? Ou comment puis-je y parvenir sans erreur dans la hiérarchie du contrôleur de vue?
Peu importe la vue à laquelle vous ajoutez le viewController enfant. Si une vue d'un viewController est ajoutée à un autre viewController, vous devez la définir correctement.
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];
Pour afficher un child_view_controller sur un main_view_controller.
étape 1: créez un main_view_controller dans le storyboard.
étape 2: créez un child_view_controller avec un Iview et une étiquette à l'intérieur dans le storyboard.
étape: dans l'action du bouton main_view_controller, ajoutez le code suivant:
- (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];
}
//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];
}
Ajouter et supprimer viewcontroller, # childviewcontroller