Pregunta

La pregunta raíz es "¿cuántos UIViewControllers puede insertar en la pila de navegación?" sin causar advertencias de memoria o ganar una terminación de vigilancia.

Suponga que tengo una aplicación que es básicamente una base de datos para tres entidades donde cada una puede tener una relación con alguna otra entidad, y la relación se muestra en un UIViewController. Los usuarios pueden seguir esas relaciones y cada una muestra un nuevo controlador: si las entidades son A, B y C y A- > B- > C- > B- > C- > A, cada tipo de vista está en la pila dos veces. Entiendo cómo presionar y saltar, cómo retroceder a un controlador en particular, y creo que en lugar de simplemente extender la pila de navegación indefinidamente, sería mejor reutilizar un controlador de vista en la pila de navegación.

Para hacer esto, cada vez que quería un FirstEntityViewController podía escanear la pila de navegación para encontrar un objeto donde [self isKindOfClass: [clase FirstEntityViewController]]; y luego llamar a los métodos diseñados para reajustar esa vista para lo que actualmente quiero ver: solo actualizar los datos de la misma manera que cuando reutiliza un UITableViewCell.

Esto está bien, excepto por el efecto que podría tener en el NavigationController. Si uso UINavigationController: popToViewController: animated: creo que va a descartar todo lo que está encima de la vista a la que estoy apareciendo, incluida la vista que el usuario espera encontrar al tocar " Atrás " en la barra de navegación. Entonces, el usuario toca una relación, retrocede y dice "¿eh?"

Si elimino el controlador correspondiente de la pila de navegación y luego lo coloco en la parte superior de la pila, el comportamiento de retroceso seguirá siendo correcto siempre que el usuario no retroceda hasta la instancia de FirstEntityViewController que se movió o de lo contrario, la navegación parecerá inconsistente.

¿Es la solución correcta para quitar el controlador de la pila y, de alguna manera, mantener un lugar en la pila de modo que cuando se suelta el controlador reutilizado se pueda reemplazar de donde vino? ¿Debo mantener mi propia lista de tipos de visualización y visualización de datos para que, cuando aparezca, pueda reemplazar la vista debajo de la vista a punto de aparecer, manteniéndome un paso por delante de la navegación hacia atrás?

¿O eso se está volviendo demasiado complicado? ¿No hay necesidad de preocuparse por esta situación porque el sistema operativo reutiliza gran parte de los controladores de vista de la misma manera que se reutilizan UITableViewCells, y no hay un impacto real en la memoria o el rendimiento al tener una pila de navegación de 50 profundidades?

¿Fue útil?

Solución

Las instancias de ViewController permanecen en la pila de UINavigationController, pero cualquier vista, excepto la vista superior, se puede descargar en cualquier momento (se notifica al controlador de vista a través del mensaje viewDidUnload ).

En otras palabras, las vistas debajo de la vista superior no se quedan y eventualmente se descargarán en condiciones de poca memoria, por lo que no es necesario que intente reutilizar sus controladores de vista.

Otros consejos

La última vez que verifiqué que no puedes empujar un controlador de vista que ya está en una pila de controlador de navegación nuevamente sobre él. Tendrás que crear un nuevo controlador de vista y empujarlo hacia la pila y cada botón de retroceso saldrá de la pila. Lo mejor que puede hacer es hacer un caché de controladores de vista y distribuirlos según sea necesario, siempre que se retiren de la pila del controlador de navegación. Pero probablemente no le comprará mucho a modo de ahorro de memoria.

UITableViews es un poco diferente en el sentido de que solo hay un número relativamente pequeño de celdas a la vista en un momento dado y tan pronto como la celda se apaga de la pantalla, se elimina y vuelve a la agrupación. Si puede garantizar que la profundidad máxima de su cadena sea fija, puede obtener un esquema de ventanas similar. De lo contrario, es posible que deba seguir profundizando y estar atento a la liberación de memoria tan pronto como sea posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top