ios - presentviewcontroller swift 4
Presentar mĂșltiples controladores de vista modal? (5)
La manera trivial de intentar lograr eso es simplemente crear los VCs que desea presentar de forma modal y presentar uno después del otro. Desafortunadamente, esto no va a funcionar. Lo que obtienes es solo el primer CV presentado, todos los demás simplemente no van a ninguna parte. UIKit simplemente no cooperará contigo aquí.
http://xissburg.com/presenting-multiple-modal-view-controllers-at-once/
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
actualizar:
He enfrentado este problema de nuevo, y encontré otra manera. Si la presentación del controlador no está incrustada en el controlador de navegación, se ocultará si el controlador presentado no aparece en pantalla completa y se volverá negro. Método setModalPresentationStyle: UIModalPresentationCurrentContext se puede aplicar solo al controlador de navegación. Así que incruste la presentación del controlador en UINavigationController, configure UIModalPresentationCurrentContext y presente un nuevo controlador; obtendrá el controlador de diálogo.
Estoy presentando el controlador de búsqueda, tiene TableView que empuja el controlador detallado de la pila.
El controlador detallado puede presentar el controlador de vista con mensaje, consiste en un fondo UIView pequeño y semitransparente.
Problema: cuando se presentó el controlador de la última vista, todos los controladores de vista debajo se ocultan y el controlador que presenta el controlador de búsqueda se vuelve visible.
Aquí lo que estoy haciendo:
SearchViewController *viewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
viewController.data = dataArray;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
[self.navigationController presentViewController:navigationController animated:YES completion:nil];
que la tabla empuja la vista detallada:
DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[viewController setHidesBottomBarWhenPushed:YES];
viewController.dataItem = [data objectAtIndex:(NSUInteger) [indexPath row]];
[self.navigationController pushViewController:viewController animated:YES];
y vista detallada que presenta el cuadro de mensaje:
MessageController *controller = [[MessageController alloc] initWithNibName:@"MessageController" bundle:nil];
controller.message = message;
[self presentViewController:controller animated:YES completion:nil];
Cuando se descarta, todos los controladores debajo de él se hicieron visibles.
actualizar:
todo lo que quería es presentar modalmente un controlador de vista que tenga uitableview. De esta tabla para mostrar una vista detallada que podrá mostrar el cuadro de mensaje. El cuadro de mensaje debe ser otro controlador de vista. Y cuando se muestra el cuadro de mensaje, desaparecen los dos controladores anteriores. ese es el problema.
En algunas situaciones, puede hacer que cada controlador de visualización presentado de forma modal presente el siguiente.
let window = UIApplication.sharedApplication().keyWindow!
if let modalVC = window.rootViewController?.presentedViewController {
modalVC.presentViewController(vc, animated: true, completion: nil)
} else {
window.rootViewController!.presentViewController(vc, animated: true, completion: nil)
}
Esta respuesta puede parecer poco convencional, pero funciona. Te permite "abrir múltiples modales", pero solo mostrar uno a la vez. La clave es tener solo un modal, pero use un Controlador de barra de pestañas para alternar entre los Controladores de Vista .
- Conecte su transición modal desde el Controlador de Vista azul (que presenta) a un contenedor modal (que es simplemente un Controlador de Vista normal)
- El contenedor modal solo contiene una Vista de contenedor , cuyo único propósito es incrustar un Controlador de barra de pestañas .
- Incruste un controlador de barra de pestañas dentro de la Vista de contenedor
- Cada pestaña puede ser un controlador de vista separado, que representa "modales múltiples"
- Establezca la barra de pestañas del controlador de la barra de pestañas en oculto
- Cambiar entre modales usando
tabBarController?.selectedIndex = 1
- Cierre el modal normalmente con
dismissViewControllerAnimated(true, completion: nil)
Se vería algo como esto:
Establezca el modalPresentationStyle
correcto tanto en el navigationController
el viewController
.
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
vcToPresent.preferredContentSize = CGSizeMake(650, 450);
[self presentViewController:vcToPresent animated:YES completion:^{
self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`
Descartar todos los controladores de vista por encima del controlador de vista presentado.
La documentación de Apple sigue:
Si presenta varios controladores de vista sucesivamente, construyendo una pila de controladores de vista presentados, al invocar este método en un controlador de vista inferior en la pila se descarta su controlador de vista secundaria inmediato y todos los controladores de vista sobre ese niño en la pila. Cuando esto sucede, solo se descarta la vista más alta de forma animada; cualquier controlador de vista intermedio simplemente se elimina de la pila. La vista superior se descarta utilizando su estilo de transición modal, que puede diferir de los estilos utilizados por otros controladores de vista inferiores en la pila.
Descartar dos controladores de vista modal.
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];