26

Desidero aggiungere un TableViewController come controller di visualizzazione figlio di un containerViewController (mostrato di seguito). Secondo Apple di View Controller Programming Guide posso raggiungere questo obiettivo le seguenti righe di codice all'interno del mio containerViewController:Aggiungere una vista del controller di visualizzazione figlio a una sottoview del controllore della vista padre

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

In realtà, che funziona bene. Ora il problema è che non voglio aggiungere la vista di tableViewController come sottoview della vista root di containerViewController. Invece voglio aggiungerlo come una sottoview del containerView (vedi immagine) che a sua volta è una sottoview della vista root di containerViewController. Così ho cambiato il codice precedente come segue:

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

Ora quando lancio l'applicazione si blocca immediatamente con questo errore:

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

Qual è il problema? Non è possibile aggiungere una vista childViewController ad una specifica vista del suo containerViewController? O come posso ottenere questo risultato senza un errore nella gerarchia del controller di visualizzazione?

containerViewController

risposta

48

Realmente non importa quale vista si sta aggiungendo il bambino viewController a. Se una vista di una viewController viene aggiunta a un'altra viewController, è necessario impostarla correttamente.

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

Sei sicuro di questo e hai provato quel codice? L'ho provato e * fa * fa la differenza se si aggiunge la vista childViewController alla vista root del containerViewController o ad una qualsiasi delle sue subviews. – Mischa

+2

@Mischa Codice sorgente incluso nella risposta. Si prega di controllare. – Anupdas

+4

+1 per 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]; 

} 

Aggiungere e rimuovere viewcontroller, # childviewcontroller

1

Per mostrare una child_view_controller nel corso di un main_view_controller.

passo 1: creare un main_view_controller in storyboard.

passaggio 2: creare un child_view_controller con UIView e alcuni Etichetta all'interno in storyboard.

fase 3: in azione pulsante di main_view_controller aggiungere il seguente codice:

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