2009-06-04 23 views
18

Me he encontrado con esto dos veces ahora.vista modal en ocasiones oculta la barra de navegación

veces mediante la siguiente línea de código:

[self.navigationController presentModalViewController:aViewController animated:YES]; 

Representa la vista, pero la barra de navegación se oculta a continuación.

Puedo escribir:

[self.navigationController setNavigationBarHidden:NO]; 

al contenido de su corazón, en todas partes se me ocurre sin efecto.

Alguien ha topó con esto?

¿Estoy haciendo algo tonto?

Respuesta

38

No, me encontré con esto también. El problema es que cuando presenta un controlador de vista modal con una clase basada en UIViewController, no extiende la barra de navegación del controlador de navegación que llama al modal. La vista modal cubre toda la pantalla. Lo que terminé haciendo para resolver el problema era crear un UINavigationController y empuje la clase basada UIViewController en él, y luego hacer presentModalViewController a la instancia del controlador de navegación.

gustan:

UIViewController *vc = [[UIViewController alloc] init]; 
UINavigationController *cntrol = [[UINavigationController alloc] initWithRootViewController:vc]; 
[self presentModalViewController:cntrol animated:YES]; 
[cntrol release]; 

Esto me permite tener una barra de navegación en la parte superior.

No estoy seguro si eso ayudará en su caso particular, la única otra cosa que sugeriría es replicar el comportamiento del modal con un UIAnimation que se detiene 44px debajo de la parte superior del teléfono. Eso mantendría la barra de navegación original visible.

+1

Oh hombre, soy estúpido. No necesitaba el controlador de navegación en la parte superior, solo una barra de herramientas, cualquier barra de herramientas. Gracias –

+0

Por cierto, gracias por poner esa canción en mi cabeza durante las últimas 5 horas. Siento que es Navidad. –

+0

Lo he estado pasando por la cabeza durante mucho tiempo :-) –

1

Tal vez esto es obvio, pero una vez que haya terminado con la vista modal y desea desecharla, usted debe hacer algo como esto en su vc modal:

[parentController dismissModalViewControllerAnimated: YES];

Donde parentController es una referencia al vc desde el que está presentando la vista modal.

+1

Acabo de hacer [self dismissModalViewControllerAnimated: YES]; y tiene el mismo efecto. – Jonny

+0

sí, tienes razón Jonny, tal vez por algún otro problema yo no estaba trabajando para mí, quién sabe ....: P –

2

@HeatMiser muestra una gran manera de moverse por el "error" que rodea a la incapacidad para mostrar los elementos en la barra de navegación. No estoy seguro, sin embargo, si esto es estrictamente un error en la presentación, ya que las operaciones modales deberían superar el tema de interfaz de la vista subyacente. Tener el tema de la operación modal imitando el tema UI subyacente está bien, pero me parece incorrecto envolver la vista modal verdadera con una vista de navegación (objeto de vista adicional solo para obtener un poco más de comportamiento).

En su lugar, lo siguiente funcionó para mí y da el mismo comportamiento que el "Nuevo mensaje" en el programa de correo (en el iPhone).

En IB, coloque un UIToolBar en la parte superior de la pantalla modal (imitando la barra de navegación) con "Cancelar" y "Guardar" UIBarButtonItem y un elemento de Botón de barra espaciadora flexible entre los para alinear los botones izquierdo y derecho . Luego, agregue un UILabel centrado sobre el UIToolBar (The Font Helvetica, Bold, Size 18 parece coincidir con el título de la barra de navegación). Conecte los botones a IBAction en el UIViewController modal, y listo.

1

Si hay un controlador de navegación activa, a continuación, sólo debe usar

[self.navigationController pushViewControllerAnimated: cómo];

para deslizar otro controlador de vista, mientras que usted y el usuario obtienen una interfaz de usuario consistente con soporte de botón "automático".

Una vez que se utiliza un controlador de navegación, la presentación de un controlador de vista modal solo debe realizarse para ampliar el área utilizable en la pantalla. Y luego, realmente debería usar una animación elegante para que el usuario sepa que se está alejando de la "tarea" o los "pasos" que el controlador de navegación estaba incorporando.

Cuestiones relacionadas