Добавить представление контроллера дочернего представления в подзаголовок родительского контроллера представления

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

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

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

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

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

Завершение приложения из-за неперехваченного исключения "UIViewControllerHierarchyInconsistency", причина: "контроллер дочернего представления: должен иметь родительский контроллер представления, но фактический родитель:"

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

containerViewController

Ответ 1

На самом деле не имеет значения, к какому виду вы добавляете дочерний элемент 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];

Исходный код

Ответ 2

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

Ответ 3

Чтобы показать дочерний_контроль над main_view_controller.

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

шаг 2: создайте дочерний_контроль с 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];
}