que container ios objective-c xcode uiviewcontroller container-view

ios - que - use container view swift 4



Vista del contenedor del storyboard xcode-Cómo accedo al viewcontroller (5)

Cuando agrega una vista de contenedor, xcode llama al método UIViewController addChildViewController:

En su caso, puede obtener el contenedor ViewController buscándolo en la lista de childViewControllers de childViewControllers , algo como esto:

for (UIViewController *childViewController in [self childViewControllers]) { if ([childViewController isKindOfClass:[InstallViewController class]]) { //found container view controller InstallViewController *installViewController = (InstallViewController *)childViewController; //do something with your container view viewcontroller break; } }

Ayer tuve la misma duda :)

Intento usar el guión gráfico y hacer que las cosas funcionen correctamente. Agregué a Container View a una de mis vistas existentes. Cuando trato de agregar una referencia a esto en mi controlador de vista archivo .h (ctrl-drag), obtengo un IBOutlet UIView *containerView . ¿Cómo obtengo una referencia al controlador de vista de la vista del contenedor? Necesito el controlador de vista de contenedor para poder configurarlo en el controlador de mi vista para que puedan "hablar" entre ellos.

Tengo la configuración de mi storyboard como:

Y se hace referencia en mi archivo .h como:

Observe en .h que es un UIView, no mi InstallViewController para la vista. ¿Cómo agrego una referencia al controlador de vista? Necesito poder establecer su delegado.


Hay otra solución al especificar un identificador para el (los) segmento (s) de prepareForSegue: y recuperar los controladores de vista correspondientes en el método prepareForSegue:

La ventaja de esta forma es que no necesita confiar en un orden específico en el que se agreguen los controladores de vista secundaria debido al hecho de que cada controlador de vista secundaria está incorporado a través de un identificador de segregación único.

Actualización 2013-01-17 - Ejemplo

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender { // -- Master View Controller if ([segue.identifier isEqualToString:c_SegueIdEmbedMasterVC]) { self.masterViewController = segue.destinationViewController; // ... } // -- Detail View Controller else if ([segue.identifier isEqualToString:c_SegueIdEmbedDetailVC]) { self.detailViewController = segue.destinationViewController; // ... } }

c_SegueIdEmbedMasterVC & c_SegueIdEmbedDetailVC son constantes con el ID correspondiente de los ID de segue definidos en el guión gráfico.


La respuesta de es correcta, pero podría ser más eficiente y conveniente. Especialmente cuando se accede al controlador de vista infantil varias veces.

Crear una propiedad de solo lectura

@interface MyViewController () @property (nonatomic, weak, readonly) InstallViewController *cachedInstallViewController; @end

Luego crea un método getter conveniente

- (InstallViewController *)installViewController { if (_cachedInstallViewController) return _cachedInstallViewController; __block InstallViewController *blockInstallViewController = nil; NSArray *childViewControllers = self.childViewControllers; [childViewControllers enumerateObjectsUsingBlock:^(id childViewController, NSUInteger idx, BOOL *stop) { if ([childViewController isMemberOfClass:InstallViewController.class]) { blockInstallViewController = childViewController; *stop = YES; } }]; _cachedInstallViewController = blockInstallViewController; return _cachedInstallViewController; }

A partir de ahora, acceda al controlador de vista infantil de esa manera

[self.installViewController doSomething];


Si la plumilla está cargada, llamará a addChildViewController como parte del proceso de inicialización

por lo que una solución de rendimiento también podría ser sobrescribir

- (void)addChildViewController:(UIViewController *)childController

allí puedes atrapar a tu niñoControlador, por ejemplo, comparando su Clase y asignándola a una propiedad / ivar

-(void)addChildViewController:(UIViewController *)childController { [super addChildViewController:childController]; if([childController isKindOfClass:[InstallViewController class]]) { self.installViewController = (InstallViewController *)childController; }

}

Esto evitará que itere a través de los childViewControllers.


UIView* viewInsideOfContainer = installerView.subviews[0];

Te dará la UIView dentro del UIViewController al que hace referencia tu controlador UIView. Puede convertir la subvista en cualquier tipo que herede de UIView.