26

Chcę dodać tableViewController jako kontroler widoku podrzędnego kontenera containerController (pokazany poniżej). Według Apple View Controller Programming Guide można to osiągnąć za pomocą następujących linii kodu w moim containerViewController:Dodaj kontrolkę widoku kontrolera podrzędnego do podglądu kontrolera nadrzędnego widoku

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

W rzeczywistości, że działa dobrze. Problem polega na tym, że nie chcę dodawać widoku tableViewController jako podglądu widoku głównego containerViewController. Zamiast tego chcę dodać go jako podzbiór widoku containerView (zobacz obraz), który sam jest podzbiorem widoku głównego kontenera ContainViewController. Zmieniłem więc powyższy kod w następujący sposób:

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

Teraz kiedy uruchomić aplikację ulega awarii natychmiast z tego błędu:

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

Jaki jest problem? Czy nie jest możliwe dodanie widoku childViewController do konkretnego widoku jego kontrolki containerViewController? Lub jak mogę to osiągnąć bez błędu w hierarchii kontrolera widoku?

containerViewController

Odpowiedz

48

To naprawdę nie ma znaczenia, który zobaczyć dodajesz dziecko viewController do. Jeśli widok kontrolki viewController zostanie dodany do innego kontrolera viewController, musisz go odpowiednio ustawić.

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

Czy jesteś pewien, że i ty przetestowane tego kodu? Próbowałem tego i to * robi * robi różnicę, czy dodajesz widok childViewController do widoku głównego konteneraControlViewController lub do któregokolwiek z jego podobrazów. – Mischa

+2

@Mischa Kod źródłowy dołączony do odpowiedzi. Proszę sprawdzić. – Anupdas

+4

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

} 

Dodaj i usuń viewcontroller, # childviewcontroller

1

Aby pokazać child_view_controller nad main_view_controller.

step 1: utworzyć główną kontrolkę w storybooku.

etap 2: tworzenie child_view_controller z UIView i niektóre Etykieta wewnątrz w ujęć.

krok 3: w main_view_controller za działania przycisku dodaj następujący kod:

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