Buscando comprender el ciclo de vida de iOS UIViewController

Resuelto Lorenzo B asked hace 54 años • 11 respuestas

¿Podrías explicarme la forma correcta de gestionar elUIViewController ciclo de vida?

En particular, me gustaría saber cómo usar los métodos Initialize, ViewDidLoad, ViewWillAppear, ViewDidAppear, ViewWillDisappear, ViewDidDisappeary en Mono Touch para una clase.ViewDidUnloadDisposeUIViewController

Lorenzo B avatar Jan 01 '70 08:01 Lorenzo B
Aceptado

iOS llama automáticamente a todos estos comandos en los momentos apropiados cuando carga/presenta/oculta el controlador de vista. Es importante tener en cuenta que estos métodos están adjuntos UIViewControllery no a UIViewsí mismos. No obtendrá ninguna de estas funciones simplemente usando un archivo UIView.

Hay excelente documentación en el sitio de Apple aquí . Sin embargo, poniéndolo simplemente:

  • ViewDidLoad- Se llama cuando creas la clase y la cargas desde xib. Ideal para configuración inicial y trabajo de una sola vez.

  • ViewWillAppear- Se llama justo antes de que aparezca la vista, bueno para ocultar/mostrar campos o cualquier operación que desee que se realice cada vez que la vista sea visible. Debido a que es posible que esté yendo y viniendo entre vistas, esto se llamará cada vez que su vista esté a punto de aparecer en la pantalla.

  • ViewDidAppear- Se llama después de que aparece la vista: excelente lugar para iniciar animaciones o la carga de datos externos desde una API.

  • ViewWillDisappear/ DidDisappear- Misma idea que ViewWillAppear/ ViewDidAppear.

  • ViewDidUnload/ ViewDidDispose- En Objective-C, aquí es donde haces la limpieza y liberación de cosas, pero esto se maneja automáticamente, por lo que no necesitas hacer mucho aquí.

Jacob Knobel avatar Apr 06 '2011 17:04 Jacob Knobel

ACTUALIZACIÓN: ViewDidUnload quedó obsoleto en iOS 6, por lo que actualizó la respuesta en consecuencia.

El ciclo de vida de UIViewController se diagrama aquí:

El ciclo de vida de un controlador de vista, diagramado

La ventaja de usar Xamarin Native/Mono Touch es que utiliza las API nativas y, por lo tanto, sigue el mismo ciclo de vida de ViewController que encontrará en la documentación de Apple.

Haider avatar Sep 26 '2012 18:09 Haider

Esto es para las últimas versiones de iOS (modificadas con Xcode 9.3, Swift 4.1 ). A continuación se muestran todas las etapas que completan el ciclo de vida de un UIViewControllerproducto.

  • loadView()

  • loadViewIfNeeded()

  • viewDidLoad()

  • viewWillAppear(_ animated: Bool)

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear(_ animated: Bool)

  • viewWillDisappear(_ animated: Bool)

  • viewDidDisappear(_ animated: Bool)

Déjame explicarte todas esas etapas.

1.loadView

Este evento crea/carga la vista que administra el controlador. Puede cargarse desde un archivo nib asociado o vacío UIViewsi se encuentra un valor nulo. Esto lo convierte en un buen lugar para crear vistas en código mediante programación.

Aquí es donde las subclases deben crear su jerarquía de vistas personalizada si no utilizan una plumilla. Nunca se debe llamar directamente. Solo anule este método cuando cree vistas mediante programación y asigne la vista raíz a la viewpropiedad. No llame al supermétodo cuando anule loadView .

2.loadViewIfNeeded

Si la vista actual viewControlleraún no se ha configurado, este método cargará la vista, pero recuerde que esto solo está disponible en iOS >= 9.0. Entonces, si es compatible con iOS <9.0, no espere que entre en escena.

Carga la vista del controlador de vista si aún no se ha configurado.

3.viewDidLoad

El viewDidLoadevento solo se llama cuando la vista se crea y se carga en la memoria, pero los límites de la vista aún no están definidos. Este es un buen lugar para inicializar los objetos que utilizará el controlador de vista.

Se llama después de que se haya cargado la vista. Para los controladores de vista creados en código, esto es después de -loadView. Para los controladores de vista desarchivados de una plumilla, esto ocurre después de configurar la vista.

4.viewWillAppear

Este evento notifica viewControllercada vez que aparece la vista en la pantalla. En este paso, la vista tiene límites definidos pero no se establece la orientación.

Se llama cuando la vista está a punto de hacerse visible. El valor predeterminado no hace nada.

5.viewWillLayoutSubviews

Este es el primer paso del ciclo de vida donde se finalizan los límites. Si no está utilizando restricciones o diseño automático, probablemente desee actualizar las subvistas aquí. Esto solo está disponible en iOS >=5.0. Entonces, si es compatible con iOS <5.0, no espere que entre en escena.

Se llama justo antes de que se invoque el método layoutSubviews de la vista del controlador de vista. Las subclases se pueden implementar según sea necesario. El valor predeterminado es nop.

6.viewDidLayoutSubviews

Este evento notifica al controlador de vista que las subvistas se han configurado. Es un buen lugar para realizar cambios en las subvistas una vez configuradas. Esto solo está disponible en iOS >=5.0. Entonces, si es compatible con iOS <5.0, no espere que entre en escena.

Se llama justo después de invocar el método layoutSubviews de la vista del controlador de vista. Las subclases se pueden implementar según sea necesario. El valor predeterminado es nop.

7.viewDidAppear

El viewDidAppearevento se activa después de que la vista se presenta en la pantalla. Lo que lo convierte en un buen lugar para obtener datos de un servicio backend o de una base de datos.

Se llama cuando la vista ha pasado por completo a la pantalla. El valor predeterminado no hace nada

8.viewWillDisappear

El viewWillDisappearevento se activa cuando la vista de lo presentado viewControllerestá a punto de desaparecer, descartarse, cubrirse o esconderse detrás de otra viewController. Este es un buen lugar donde puede restringir las llamadas de su red, invalidar el temporizador o liberar objetos vinculados a ese viewController.

Se llama cuando la vista se descarta, se cubre o se oculta de otro modo.

9.viewDidDisappear

Este es el último paso del ciclo de vida que cualquiera puede abordar, ya que este evento se activa justo después de que la vista presentada viewControllerhaya desaparecido, descartado, cubierto u ocultado.

Se llama después de que la vista fue descartada, cubierta o ocultada de otro modo. El valor predeterminado no hace nada

Ahora, según Apple, cuando implemente estos métodos, debe recordar llamar a superla implementación de ese método específico.

Si subclasifica UIViewController, debe llamar a la superimplementación de este método, incluso si no está utilizando un NIB. (Para su comodidad, el método init predeterminado hará esto por usted y especificará nil para los argumentos de ambos métodos). En el NIB especificado, el proxy del propietario del archivo debe tener su clase configurada en la subclase de su controlador de vista, con la salida de vista. conectado a la vista principal. Si invoca este método con un nombre de plumín nulo, entonces el -loadViewmétodo de esta clase intentará cargar un NIB cuyo nombre sea el mismo que el de la clase de su controlador de vista. Si de hecho no existe tal NIB, entonces debe llamar -setView:antes -viewde invocarlo o anular el -loadViewmétodo para configurar sus vistas mediante programación.

Espero que esto haya ayudado. Gracias.

ACTUALIZACIÓN : como @ThomasW señaló en el comentario viewWillLayoutSubviewsy viewDidLayoutSubviewstambién se llamará en otros momentos cuando se carguen subvistas de la vista principal, por ejemplo, cuando se carguen celdas de una vista de tabla o de colección.

ACTUALIZACIÓNloadView : como @Maria señaló dentro del comentario, se actualizó la descripción

onCompletion avatar Sep 21 '2015 05:09 onCompletion

iOS 10,11 (Rápido 3.1, Rápido 4.0)

Según UIViewControllerlos UIKitdesarrolladores,

1. cargarVer()

Aquí es donde las subclases deben crear su jerarquía de vistas personalizada si no usan nib . Nunca se debe llamar directamente.

2. cargarViewIfNeeded()

Carga la vista del controlador de vista si aún no se ha configurado.

3. verDidLoad()

Se llama después de que se haya cargado la vista. Para los controladores de vista creados en código, esto es después de -loadView. Para los controladores de vista desarchivados de una plumilla, esto ocurre después de configurar la vista.

4. viewWillAppear(_ animado: Bool)

Se llama cuando la vista está a punto de hacerse visible. El valor predeterminado no hace nada

5. verWillLayoutSubviews()

Se llama justo antes de que se invoque el método layoutSubviews de la vista del controlador de vista. Las subclases se pueden implementar según sea necesario. El valor predeterminado no hace nada.

6. viewDidLayoutSubviews()

Se llama justo después de invocar el método layoutSubviews de la vista del controlador de vista. Las subclases se pueden implementar según sea necesario. El valor predeterminado no hace nada.

7. viewDidAppear(_ animado: Bool)

Se llama cuando la vista ha pasado por completo a la pantalla. El valor predeterminado no hace nada

8. viewWillDisappear(_ animado: Bool)

Se llama cuando la vista se descarta, se cubre o se oculta de otro modo. El valor predeterminado no hace nada

9. viewDidDisappear(_ animado: Bool )

Se llama después de que la vista fue descartada, cubierta o ocultada de otro modo. El valor predeterminado no hace nada

10. viewWillTransition (al tamaño: CGSize, con coordinador: UIViewControllerTransitionCoordinator)

Se llama cuando la vista está en transición.

11. willMove(toParentViewController padre: UIViewController?)

12. didMove(toParentViewController padre: UIViewController?)

Estos dos métodos son públicos para que las subclases de contenedores los llamen durante la transición entre controladores secundarios. Si se anulan, las anulaciones deben garantizar que se llame al superintendente.

El argumento principal en ambos métodos es nulo cuando se elimina un hijo de su padre; de lo contrario, es igual al nuevo controlador de vista principal.

13. didReceiveMemoryWarning()

Se llama cuando la aplicación principal recibe una advertencia de memoria. En iOS 6.0 ya no borrará la vista de forma predeterminada.

Rajamohan S avatar Aug 21 '2017 12:08 Rajamohan S

A partir de iOS 6 y posteriores. El nuevo diagrama es el siguiente:

ingrese la descripción de la imagen aquí

Saad avatar Jul 08 '2015 07:07 Saad