Forzar la carga / descarga de una vista
-
22-07-2019 - |
Pregunta
¿Cómo puedo configurar un controlador de vista para actualizar los campos en la vista solo si se inserta en un controlador de navegación y libera los objetos cuando se saca de las vistas del controlador de navegación?
Mi objetivo es que para un controlador de vista:
- Actualizar pantalla solo cuando se presiona en la pila del controlador de navegación
- libera datos cuando se extrae de la pila del controlador de navegación
- reutilice el controlador tanto como sea posible (para eliminar la carga / descarga de archivos xib)
¿Hay algún método delegado para viewWillBePushed:
y viewWillBePopped:
?
Ejemplo
Digamos que tengo tres capas de vistas:
Movies (MovieListController)
--> Movie Basic Info (MovieInfoController)
--> Movie Credits (MovieCreditsController)
Supongamos que tenemos una clase Movie
para representar cada película.
Aquí, solo quiero tener tres UIViewController
s, una instancia de cada uno en el tiempo de ejecución del programa. Entonces puedo reutilizar el mismo MovieInfoController
para diferentes películas y de manera similar MovieCreditsController
.
Sin embargo, también me gustaría que MovieInfoController
solo actualice sus campos de visualización (por ejemplo, título, fecha de lanzamiento, etc.) solo cuando se inserta en la pila. La implementación de la visualización en viewWillAppear
lo obligará a actualizar los campos incluso cuando aparezca MovieCreditsController
.
Además, quiero que MovieInfoController
libere su referencia a Movie
, cuando aparece, y cualquier objeto potencialmente grande (por ejemplo, imagen de portada). La implementación de esta lógica en viewWillDisappear
hará que libere los datos cuando esté presionando MovieCreditsController
en la pila.
¿Hay razonable? ¿Voy por el camino equivocado?
Solución
Estás 90% allí porque creaste un objeto Movie. MovieListController debe poseer un único MovieInfoController. Debería llamar a -setMovie:
antes de insertarlo en el controlador de navegación. La llamada a -setMovie:
debería ser lo que actualiza sus campos.
Del mismo modo, MovieInfoController debe tener un único MovieCreditsController y debe llamar a -setMovie:
antes de insertarlo en el controlador de navegación.
En MovieListController y MovieInfoController, puede llamar a [subController setMovie: nil]
en su -viewDidAppear:
para liberar memoria.