Добавить представление дочернего контроллера представления в подпредставление родительского контроллера представления
Я хочу добавить 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? Или как я могу добиться этого без ошибки в иерархии контроллера представления?
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];
}