objective c - example - La presentación de un controlador de vista modal oculta la barra de navegación
navigation controller swift 4 example (9)
Tengo una aplicación basada en la navegación con una barra de navegación, pero hay algunos casos en los que, en lugar de insertar un controlador de vista en la pila, debo presentar el controlador de vista de manera modal. El problema es que cuando descarto el controlador de vista modal, todo funciona como se espera, excepto que la barra de navegación está oculta y se ha cambiado el tamaño de (vista principal), que es el comportamiento esperado según los documentos. Así que pensé que simplemente podría llamar a un método incorporado para mostrar la barra de navegación. Ya lo he intentado
[self.navigationController setNavigationBarHidden:NO];
así como la versión animada sin éxito.
La documentación habla de esto en el método.
presentModalViewController: animated:
en la sección de discusión donde dice,
En dispositivos iPhone y iPod touch, la vista de modalViewController siempre se presenta en pantalla completa "y" Establece la propiedad modalViewController en el controlador de vista especificado. Cambia el tamaño de su vista y la adjunta a la jerarquía de vistas. "Sin embargo, los documentos no me indicaron cómo deshacer este proceso después de descartar una vista modal.
¿Alguien más ha experimentado esto y encontrado una solución?
Edit: Estoy teniendo el mismo problema, así que en lugar de hacer mi propia pregunta, estoy patrocinando una recompensa por este. Esta es mi situación específica:
En mi caso, estoy presentando un selector de imagen en un controlador de vista modal, a través de un controlador de navegación:
-(void) chooseImage {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
imagepicker = [[UIImagePickerController alloc] init];
imagepicker.allowsEditing = NO;
imagepicker.delegate = self;
imagepicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagepicker.navigationBar.opaque = true;
imagepicker.wantsFullScreenLayout = NO;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
if (self.view.window != nil) {
popoverController = [[UIPopoverController alloc] initWithContentViewController:imagepicker];
[popoverController presentPopoverFromBarButtonItem:reset permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
} else {}
} else {
[self.navigationController presentModalViewController:imagepicker animated:YES];
}
}
}
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self.popoverController dismissPopoverAnimated:true];
} else {
[self.navigationController dismissModalViewControllerAnimated:YES];
}
//Save the image
}
-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self.popoverController dismissPopoverAnimated:true];
} else {
[self.navigationController dismissModalViewControllerAnimated:YES];
}
}
Asegúrese de presentar y descartar el modalViewController del UINavigationController, así:
// show
[self.navigationController presentModalViewController:vc animated:YES];
// dismiss
[self.navigationController dismissModalViewControllerAnimated:YES];
Si su controlador de vista está realmente en la pila de UINavigationController, esta es la forma correcta de manejar la presentación y el despido del controlador de vista modal. Si su barra de UINavigation aún está oculta, hay algo más funky en marcha y necesitaríamos ver su código para determinar qué está sucediendo.
Editar
Copié su código en una aplicación mía y el UIImagePickerController se presentó y se descartó con éxito y la barra UINavigation de mi UINavigationController todavía estaba allí. Realmente creo que el problema está en otra parte de su arquitectura. Si subes un archivo zip con un proyecto de ejemplo, echaré un vistazo.
Creo que he visto este comportamiento al presentar un controlador de vista en el VC incorrecto. ¿Está llamando a presentModalViewController
en el controlador de navegación o al VC individual?
Intenta llamar desde el control de navegación si aún no lo has hecho.
[self.navigationController presentModalViewController:myVC animated:YES];
Enfático y devin
Cuando comencé a leer los documentos de Apple para familiarizarme con el problema, noté que el método que está utilizando, presentModalViewController:animated:
parece estar obsoleto en favor de presentViewController:animated:completion:
Quizás deberías intentar usar ese método en su lugar.
Para su comodidad, eche un vistazo por sí mismo:
presentModalViewController: animated: reference
Trataré de armar un programa de prueba rápida para ver si lo que dije anteriormente es realmente cierto. Pero dale una oportunidad, ¡tal vez te ayude!
Mira esto. Esta es la documentación de Apple bajo la referencia de clase UIViewController:
Menciona claramente que la vista modal siempre se presenta en modo de pantalla completa, por lo que es obvio que la barra de navegación estará oculta. Así que ponga la barra de navegación separada en la vista modal para navegar hacia atrás.
presentModalViewController:animated:
Presents a modal view managed by the given view controller to the user.
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
Parameters
modalViewController
The view controller that manages the modal view.
animated
If YES, animates the view as it’s presented; otherwise, does not.
Discussion
On iPhone and iPod touch devices, the view of modalViewController is always presented full screen. On iPad, the presentation depends on the value in the modalPresentationStyle property.
Sets the modalViewController property to the specified view controller. Resizes its view and attaches it to the view hierarchy. The view is animated according to the transition style specified in the modalTransitionStyle property of the controller in the modalViewController parameter.
Availability
Available in iOS 2.0 and later.
Espero que esto te ayude a comprender que ocultar la vista completa junto con el controlador de navegación es el comportamiento predeterminado para la vista modal, así que intenta colocar una barra de navegación separada en la vista modal para navegar.
Puedes consultar más en este enlace.
Si presenta un controlador como modelo, Ver controlador aparecerá en vista total.
Si desea acceder a las propiedades del controlador de navegación a través de la vista de modelo, debe crear otra referencia de controlador de navegación y continúa como la anterior.
Esto puede ser útil para usted.
Simplemente intente seguir el código que funcionará
SettingsViewController *settings = [[SettingsViewController alloc] init];
UINavigationController *navcont = [[UINavigationController alloc] initWithRootViewController:settings];
[self presentModalViewController:navcont animated:YES];
[settings release];
[navcont release];
Es necesario presentar el controlador de navegación para tener la barra de navegación en el controlador presentado
Una de las mejores soluciones es usar esta categoría MaryPopin https://github.com/Backelite/MaryPopin
Xcode tiene una plantilla que se parece bastante a lo que estás haciendo. a partir de los resultados, no creo que debas intentar realizar [self.navigationController presentModalViewController: vc] y [self.navigationController dismissModalViewControllerAnimated:], sino que simplemente [self presentModalViewController:] y [self expulsModalViewControllerAnimated].
Para ver cómo la plantilla hace esto por sí mismo, puede usar el nuevo asistente de proyectos en xcode 4.3. Tal vez proporcionará alguna orientación:
de esa opción, elija Siguiente, luego asigne un nombre a su proyecto de prueba, elija "Universal", desactive el conteo automático de referencias, presione siguiente, guarde donde lo desee.
ahora, haga clic en el objetivo y cambie el objetivo de implementación a 4.3 (o 4.0 si lo prefiere) para sus propósitos de prueba, y cambie a su dispositivo o al simulador de iOS 4.3.
finalmente, sustituya el siguiente código en applicationDidFinishLaunching: withOptions: en el AppDelegate.m creado:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone"
bundle:nil] autorelease];
} else {
self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad"
bundle:nil] autorelease];
}
UINavigationController* navigationController
= [[UINavigationController alloc] initWithRootViewController:self.mainViewController];
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
return YES;
ahora, cuando ejecuto esto, no oculta la barra de navegación. y en el MainViewController.m creado a partir de la plantilla, verá cómo presenta el controlador de vista modal y lo descarta desde el propio controlador y no desde el controlador de navegación. por si acaso, para hacer que el código de la plantilla sea más parecido al suyo, vaya a MainViewController.m y elimine la línea que establece el estilo de transición del controlador de vista modal ...
(por supuesto, en iOS 5, con guiones gráficos, lo mismo se puede lograr con los seguros modales ... que es como lo he hecho para las aplicaciones que no soporta para pre-5.0 que presentan un modalViewController en este Moda.)
AddContactVC *addController =[self.storyboard instantiateViewControllerWithIdentifier:@"AddContactVC"];
UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:addController];
[self presentViewController:navigationController animated:YES completion: nil];
trabajando para mí muestra barra de navegación