2009-04-02 31 views
7

Tengo un UIViewController que se inserta en un UINavigationController y se muestra actualmente. Cuando voy a iniciar algunas tareas asincrónicas dentro del controlador de vista, puedo configurar ocultaBackButton en self.navigationItem a , y el botón Atrás está oculto correctamente.¿Por qué Self.navigationItem.hidesBackButton no funciona?

Tan pronto como la tarea ha terminado, y puse hidesBackButton de nuevo a NO (en el hilo de interfaz de usuario, por cierto, me he asegurado de ello), no pasa nada. El botón Atrás permanece oculto.

¿Alguien ha visto esto antes? Lo que me vuelve especialmente loco es que en mi aplicación (la misma aplicación), en una jerarquía diferente UINavigationController, el mismo código funciona correctamente.

Respuesta

4

¿Está llamando a hideBackButton = NO desde un hilo? Todas las operaciones de UI deben realizarse en el hilo principal, de lo contrario no tendrán ningún efecto.

+0

performSelectorOnMainThread se usa para derivar tareas al hilo de UI, ¿correcto? –

+0

sí. eso es correcto. [self performSelectorOnMainThread: ...] – lostInTransit

+0

¡Esto fue todo! ¡Gracias! –

1

¿Ha intentado forzar la vista para actualizar llamando a setNeedsDisplay? Quizás el sistema operativo no esté detectando los cambios instantáneamente y usted necesita forzarlo.

+0

Hmm, no era consciente de eso, lo intentaré. –

1

¿Has probado usar el método setHidesBackButton: animado: en su lugar? Tal vez eso tiene un comportamiento ligeramente diferente.

+0

Lo intentaré, pero me preocupa que en su lugar estoy haciendo algo mal en uno de mis UINavigationControllers, ya que funciona en el otro UINavigationController. Recurrir a una versión diferente de setHidesBackButton simplemente parece una curita. –

2

No he podido replicar su problema en mi máquina. sin embargo, me enfrenté a un problema similar con las tablas incluso cuando estaba actualizando mi interfaz de usuario en el hilo principal. pero llamar a setNeedsDisplay solucionó ese problema.

¿Se puede probar esto y ver si esto funciona:

[self.navigationController.navigationBar setNeedsDisplay]; 

supongo que esto debería funcionar, es necesario hacer lo mismo, pero por el navigationbar lugar. por favor, avíseme si esto funcionó, ya que no puedo probar mi solución porque nunca tengo este problema :-)

+0

Hmmmmmmmm, interesante - Voy a intentarlo. Todavía me molesta que esto funcione en uno de mis otros UINavigationControllers, sin embargo, y no funciona en un UINavigationController diferente. ¿Por qué habría que volver a mostrar uno, mientras que el otro no? : -/ –

+0

jaja - buena pregunta compañero - todavía no entiendo por qué mi pantalla de visualización se actualiza en mi primera vista y no en mi segunda vista ;-) también tengo el mismo problema con UIAlertViews. – Raj

+0

Jaja, sí, he visto cosas raras como esa también, * suspiro *, el SDK está mejorando, pero no está a la par, en mi opinión. –

1

En mi caso simplemente tuve que dar un título a la vista, como en: self.navigationItem.title = @ "Menú";

Marinus

1

Hace poco tuve un problema similar. Intenté literalmente todo lo que encontré en SO y otros foros, nada funcionó.

En mi caso, se mostró UINavigationController con un controlador raíz simple que presionaría uno de los dos controladores de visualización (A y B) en la parte superior de la pila del controlador cuando se presionó el botón A o B, respectivamente. El controlador B era el que no debía mostrar el botón Atrás. Pero aún así, a veces lo hacía, otras veces no.

Después de horas de depuración, logré rastrearlo. El controlador A era UITableViewController. Cada vez que seleccionaba una celda en este controlador, el delegado sacaba el Controlador A de la pila. PERO. Hice uso de UISearchDisplayController también. Resultó que al abrir la vista mientras el controlador de búsqueda aún estaba activo se dañó algo en el controlador de navegación que imposibilitó ocultar el botón Atrás en el Controlador B (bueno, eventualmente permaneció oculto entre viewDidLoad y viewDidAppear: pero luego siempre se volvió visible)

Así que la solución (en vez solución) fue modificado esta línea en donde fue despedido controlador A:

controllerA.searchDisplayController.active = NO; 

// ... 
// [self.navigationController popViewControllerAnimated:YES]; 

Esperanza esta perdona a alguien un par de horas.

Cuestiones relacionadas