6

En una aplicación basada en la barra de pestañas, si he empujado a un controlador en la pila de navegación de una ficha y después, cuando otra pestaña está activo, trato de hacer estallar ese controlador, no quede en libertad a menos que el pop sin animación .¿UIKit no libera el controlador si no se elimina con la animación?

Esto funciona:

[navigationController popToRootViewControllerAnimated:NO]; 

Y esto sin que:

[navigationController popToRootViewControllerAnimated:YES]; 

¿Alguien tiene alguna idea de lo que está pasando aquí? ¿El parámetro animated está siendo utilizado incorrectamente?

ACTUALIZACIÓN:

de Apple me informó que esto es de hecho un error en UIKit, y lo marcó alguien tan urgente y se le asigna. Puede que se haya resuelto en los últimos lanzamientos, pero no tuve tiempo de verificarlo.

+1

suena como un error en UIKit. Si puede confirmarlo con un proyecto simple, envíelo a Apple. –

+0

Acabo de crear un proyecto de muestra para confirmarlo, y puedo hacerlo. Por supuesto, no es algo que esté sucediendo con * cada * uso de UINavigationController. Sucede si tiene un UITabBarController con un controlador de navegación dentro de una pestaña, y desde otra pestaña abre el controlador de navegación. Lo que noté es que, si tienes más de 1 controlador de visualización en la pila, todos se liberan, excepto el último, que permanece retenido hasta que seleccionas la otra pestaña (la que tiene el controlador de navegación). – eugeniodepalo

+1

Si por el "último" controlador que quiere decir el controlador de la raíz, entonces este es pertinente: "Si el controlador de vista en la parte superior de la pila es el controlador de vista raíz, este método no hace nada ... no se puede hacer estallar el último elemento la pila." (De la documentación para 'popViewControllerAnimated:'.) Muy rara vez tiene que preocuparse cuando UIKit libera objetos. Solo asegúrate de hacer tu parte de la gestión de la memoria. Quién sabe, tal vez los marcos se aferran a un objeto para reciclarlo más tarde? O tal vez no. El punto es que puedes confiar en que estén bien probados. – Felixyz

Respuesta

0

lo que sugiere Dshutsi es correcto. Si desea que se eliminen las notificaciones, es mejor invocarlo en el método viewDidUnload del controlador. Este método se invoca cuando el controlador se descarga de la pila. Solo estoy citando esto porque no podemos votar el comentario como una respuesta.

+0

En la documentación está escrito que viewDidUnload se llama solo en condiciones de poca memoria. Supongo que este no es el caso. Si bien esta no es realmente la respuesta que estaba buscando (el controlador * debería * ser liberado), lo aceptaré ya que es la única solución de trabajo además de pasar SÍ al parámetro animado. Gracias. – eugeniodepalo

0

Si el problema principal son las notificaciones observadas, por qué no eliminar los observadores en el "- (void) viewWillDisappear: (BOOL) animada" - método?

+0

Porque todavía quiero que se reciba la notificación si el controlador está oculto (por ejemplo, el usuario selecciona otra pestaña). Creo que se llama a viewWillDisappear: cada vez que el controlador no se muestra en la pantalla, ¿no? – eugeniodepalo

+0

Puede probar el método viewDidUnload que se debe invocar cuando la vista se libera de su controlador. Eche un vistazo a la documentación en: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW36 – Dshutsi

Cuestiones relacionadas