web-dev-qa-db-fra.com

Ajouter une vue de contrôleur de vue enfant à une sous-vue du contrôleur de vue parent

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?

containerViewController

28
Mischa

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

Code source

48
Anupdas

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

1
Manjeet