que container ios addsubview parentviewcontroller container-view childviewcontroller
Código fuente

ios - container - Agregar la vista de un controlador de vista secundario a una subvista del controlador de vista principal



use container view swift 4 (3)

Quiero agregar un tableViewController como controlador de vista secundario de un containerViewController (se muestra a continuación). De acuerdo con la Guía de programación de View View de Apple, puedo lograrlo mediante las siguientes líneas de código dentro de mi containerViewController:

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

De hecho, eso funciona bien. Ahora el problema es que no quiero agregar la vista tableViewController como una subvista de la vista raíz del containerViewController. En su lugar, quiero agregarlo como una subvista del containerView (ver imagen) que en sí es una subvista de la vista raíz del containerViewController. Así que cambié el código anterior de la siguiente manera:

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

Ahora, cuando lanzo la aplicación, se bloquea inmediatamente con este error:

La aplicación finaliza debido a la excepción no detectada ''UIViewControllerHierarchyInconsistency'', razón: ''controlador de vista secundario: debe tener controlador de vista principal: pero el padre real es:''

¿Cuál es el problema aquí? ¿No es posible agregar una vista childViewController a una subvista específica de su containerViewController? ¿O cómo puedo lograr esto sin un error en la jerarquía del controlador de vista?


Realmente no importa a qué vista esté agregando el controlador de vista secundario. Si se agrega una vista de un viewController a otro viewController, debe configurarlo correctamente.

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

Código fuente


Para mostrar un child_view_controller sobre un main_view_controller.

paso 1 : crea un main_view_controller en el guión gráfico.

paso 2 : crea un child_view_controller con una UIview y alguna etiqueta dentro del guión gráfico.

Paso 3 : en la acción del botón main_view_controller, agregue el siguiente código:

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


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

Agregar y quitar viewcontroller, # childviewcontroller