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:

  1. Actualizar pantalla solo cuando se presiona en la pila del controlador de navegación
  2. libera datos cuando se extrae de la pila del controlador de navegación
  3. 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?

¿Fue útil?

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.

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