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

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

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

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

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

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

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

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

containerViewController

3 ответа

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

Исходный код

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

Чтобы показать 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];
}
Другие вопросы по тегам