Buscando comprender el ciclo de vida de iOS UIViewController
¿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
, ViewDidDisappear
y en Mono Touch para una clase.ViewDidUnload
Dispose
UIViewController
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 UIViewController
y no a UIView
sí 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 queViewWillAppear
/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í.
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í:
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.
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 UIViewController
producto.
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 UIView
si 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
view
propiedad. No llame al supermétodo cuando anule loadView .
2.loadViewIfNeeded
Si la vista actual viewController
aú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 viewDidLoad
evento 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 viewController
cada 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 viewDidAppear
evento 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 viewWillDisappear
evento se activa cuando la vista de lo presentado viewController
está 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 viewController
haya 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 super
la 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
-loadView
mé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-view
de invocarlo o anular el-loadView
método para configurar sus vistas mediante programación.
Espero que esto haya ayudado. Gracias.
ACTUALIZACIÓN : como @ThomasW señaló en el comentario viewWillLayoutSubviews
y viewDidLayoutSubviews
tambié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
iOS 10,11 (Rápido 3.1, Rápido 4.0)
Según UIViewController
los UIKit
desarrolladores,
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.
A partir de iOS 6 y posteriores. El nuevo diagrama es el siguiente: