26

Je souhaite 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 suivantes de code à l'intérieur de mon containerViewController:Ajouter une vue de contrôleur de vue enfant à une sous-vue du contrôleur de vue parent

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

En fait, qui fonctionne très bien. Maintenant, le problème est que je ne veux pas ajouter la vue de tableViewController en tant que sous-vue de la vue racine de containerViewController. Au lieu de cela, je veux l'ajouter comme une sous-vue du containerView (voir image) qui est elle-même une sous-vue de la vue racine de containerViewController. Donc, j'ai changé le code ci-dessus comme suit:

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

Maintenant, quand je lance l'application, il se bloque immédiatement avec cette erreur:

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

Quel est le problème ici? Est-il impossible d'ajouter la vue d'un enfantViewController à une vue spécifique de son containerViewController? sub? Ou comment puis-je y parvenir sans erreur dans la hiérarchie du contrôleur de vue?

containerViewController

Répondre

48

Il ne compte pas vraiment que vous ajoutez voir l'enfant à viewController. Si une vue d'un viewController est ajoutée à un autre viewController, vous devez le 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]; 

Source code

+0

Êtes-vous sûr et avez-vous testé ce code? J'ai essayé cela et cela * fait * une différence si vous ajoutez la vue de childViewController à la vue racine de containerViewController ou à l'une de ses sous-vues. – Mischa

+2

@Mischa Code source inclus à la réponse. Vérifiez s'il vous plaît. – Anupdas

+4

+1 pour tableViewController.view.frame = self.contentView.bounds; – onmyway133

1
//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

Pour afficher une child_view_controller sur une main_view_controller.

étape 1: créer un main_view_controller en story-board.

étape 2: créer un child_view_controller avec un UIView et une étiquette à l'intérieur en story-board.

étape 3: dans l'action du bouton de 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]; 
} 
Questions connexes