26

Я хочу добавить tableViewController в качестве контроллера дочернего представления containerViewController (показано ниже). По словам Apple, View Controller Programming Guide я могу добиться этого с помощью следующих строк кода внутри моего containerViewController:Добавить представление контроллера детского просмотра в подпункт родительского контроллера представления

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

На самом деле, это работает отлично. Теперь проблема заключается в том, что я не хочу добавлять представление tableViewController в качестве поднабора корневого представления containerViewController. Вместо этого я хочу добавить его как подпункт containerView (см. Изображение), который сам является подвидью корневого представления containerViewController. Поэтому я изменил код выше выглядит следующим образом:

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

Теперь, когда я запустить приложение, он выходит из строя сразу с этой ошибкой:

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

Что здесь проблема? Невозможно добавить представление childViewController к определенному под вид его контейнераViewController? Или как я могу достичь этого без ошибки в иерархии диспетчера представлений?

containerViewController

ответ

48

Это действительно не имеет значения, какой вид вы добавляете ребенка ViewController к. Если представление viewController добавлено в другой viewController, вам необходимо установить его правильно.

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

вы уверены, что и Вы проверили этот код? Я пробовал это, и он * делает * имеет значение, добавляете ли вы представление childViewController в корневой вид containerViewController или в любое из его подзонов. – Mischa

+2

@Mischa Исходный код, включенный в ответ. Пожалуйста, проверьте. – Anupdas

+4

+1 для таблицыViewController.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]; 

} 

Добавление и удаление ViewController, # childviewcontroller

1

Чтобы показать child_view_controller над main_view_controller.

шаг 1: создать main_view_controller в раскадровке.

шаг 2: создать child_view_controller с UIView и некоторые этикетки внутри в раскадровке.

шаг 3: в кнопке действия main_view_controller добавим следующий код:

- (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]; 
} 
Смежные вопросы

 Смежные вопросы