¿Podría explicarme la forma correcta de administrar el UIViewController
ciclo de vida?
En particular, me gustaría saber cómo utilizar Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
y Dispose
métodos en Mono táctil para una UIViewController
clase.
ios
uiviewcontroller
xamarin.ios
lifecycle
Lorenzo B
fuente
fuente
Respuestas:
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 unidos
UIViewController
y no aUIView
ellos mismos. No obtendrá ninguna de estas características simplemente usando aUIView
.Hay una gran documentación en el sitio de Apple aquí . Sin embargo, simplemente:
ViewDidLoad
- Se llama cuando crea la clase y carga desde xib. Ideal para la configuración inicial y el trabajo único.ViewWillAppear
- Llamado justo antes de que aparezca su vista, es bueno para ocultar / mostrar campos o cualquier operación que desee que ocurra cada vez antes de que la vista sea visible. Debido a que puede estar yendo y viniendo entre las vistas, esto se llamará cada vez que su vista esté a punto de aparecer en la pantalla.ViewDidAppear
- Llamado después de que aparece la vista: excelente lugar para comenzar una animación o la carga de datos externos desde una API.ViewWillDisappear
/DidDisappear
- Misma idea queViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- En Objective-C, aquí es donde haces tu limpieza y liberación de cosas, pero esto se maneja automáticamente, por lo que no hay mucho que realmente necesites hacer aquí.fuente
ACTUALIZACIÓN: ViewDidUnload fue desaprobado en iOS 6, por lo que actualizó la respuesta en consecuencia.
El ciclo de vida de UIViewController se esquematiza aquí:
La ventaja de usar Xamarin Native / Mono Touch es que utiliza las API nativas, por lo que sigue el mismo ciclo de vida de ViewController que encontraría en la documentación de Apple.
fuente
Esto es para las últimas versiones de iOS (modificado con Xcode 9.3, Swift 4.1 ). A continuación se detallan todas las etapas que hacen que el ciclo de vida sea
UIViewController
completo.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. Se puede cargar desde un archivo nib asociado o un vacío
UIView
si se encontró nulo. Esto lo convierte en un buen lugar para crear sus vistas en código mediante programación.2)
loadViewIfNeeded
Si
viewController
aún no se ha configurado la vista de corriente , este método cargará la vista, pero recuerde, esto solo está disponible en iOS> = 9.0. Entonces, si es compatible con iOS <9.0, no espere que aparezca en la imagen.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 usará el controlador de vista.4)
viewWillAppear
Este evento notifica
viewController
cuando aparece la vista en la pantalla. En este paso, la vista tiene límites definidos pero la orientación no está establecida.5)
viewWillLayoutSubviews
Este es el primer paso en el 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 aparezca en la imagen.
6)
viewDidLayoutSubviews
Este evento notifica al controlador de vista que las subvistas han sido configuradas. Es un buen lugar para realizar cambios en las subvistas después de que se hayan configurado. Esto solo está disponible en iOS> = 5.0. Entonces, si es compatible con iOS <5.0, no espere que aparezca en la imagen.
7)
viewDidAppear
El
viewDidAppear
evento se dispara 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 de fondo o una base de datos.8)
viewWillDisappear
El
viewWillDisappear
evento se dispara cuando se presenta la vistaviewController
está a punto de desaparecer, descartar, cubrir u ocultar detrás de otroviewController
. Este es un buen lugar donde puede restringir sus llamadas de red, invalidar el temporizador o liberar objetos vinculados a esoviewController
.9)
viewDidDisappear
Este es el último paso del ciclo de vida que cualquiera puede abordar, ya que este evento se dispara justo después de la vista presentada
viewController
ha desaparecido, descartado, cubierto u oculto.Ahora, según Apple, cuando implemente estos métodos, recuerde llamar a la
super
implementación de ese método específico.Espero que esto haya ayudado. Gracias.
ACTUALIZACIÓN : como @ThomasW señaló dentro del comentario
viewWillLayoutSubviews
yviewDidLayoutSubviews
también se le llamará en otras ocasiones cuando se cargan subvistas de la vista principal, por ejemplo, cuando se cargan las celdas de una vista de tabla o vista de colección.ACTUALIZACIÓN : como señaló @Maria en el comentario,
loadView
se actualizó la descripción defuente
viewWillLayoutSubviews
yviewDidLayoutSubviews
también se llamará en otros momentos cuando se cargan subvistas de la vista principal, por ejemplo, cuando se cargan las celdas de una vista de tabla o vista de colección.viewWillAppear
viewDidAppear
viewDidDisappear
. Debes llamar super en algún momento.iOS 10,11 (Swift 3.1, Swift 4.0)
De acuerdo con
UIViewController
enUIKit
los desarrolladores,1. loadView ()
Aquí es donde las subclases deberían crear su jerarquía de vista personalizada si no están usando una punta . Nunca debe ser llamado directamente.
2. loadViewIfNeeded ()
Carga la vista del controlador de vista si aún no se ha configurado.
3. viewDidLoad ()
Llamado después de que la vista ha sido cargada. Para los controladores de vista creados en código, esto es después de -loadView. Para los controladores de vista no archivados desde una punta, esto es después de que se establece la vista.
4. viewWillAppear (_ animado: Bool)
Se llama cuando la vista está a punto de hacerse visible. El valor predeterminado no hace nada
5. viewWillLayoutSubviews ()
Llamado justo antes de que se invoque el método de diseño de vistas del controlador de vista. Las subclases pueden implementarse según sea necesario. El valor predeterminado no hace nada.
6. viewDidLayoutSubviews ()
Se invoca justo después de invocar el diseño de vista del controlador de vista. Las subclases pueden implementarse según sea necesario. El valor predeterminado no hace nada.
7. viewDidAppear (_ animado: Bool)
Se llama cuando la vista se ha transferido completamente 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. El valor predeterminado no hace nada
9. viewDidDisappear (_ animado: Bool )
Llamado después de que la vista fue desestimada, cubierta u oculta. El valor predeterminado no hace nada
10. viewWillTransition (a tamaño: CGSize, con coordinador: UIViewControllerTransitionCoordinator)
Se llama cuando la vista está en transición.
11. willMove (toParentViewController parent: UIViewController?)
12. didMove (toParentViewController parent: UIViewController?)
Estos dos métodos son públicos para que se invoquen las subclases de contenedores al realizar la transición entre controladores secundarios. Si se anulan, las anulaciones deben asegurarse de llamar al super.
El argumento padre en ambos métodos es nulo cuando un niño está siendo eliminado 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.
fuente
nib
como se menciona a continuaciónloadView
?viewWillLayoutSubviews()
se llama antes de que el objeto de vista de ViewController invoque sulayoutSubviews()
métodoA partir de iOS 6 y posteriores. El nuevo diagrama es el siguiente:
fuente
Concentrémonos en los métodos, que son responsables del ciclo de vida de UIViewController :
Creación:
- (void)init
- (void)initWithNibName:
Ver creación:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
Manejo del cambio de estado de vista:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
Manejo de advertencia de memoria:
- (void)didReceiveMemoryWarning
Desasignación
- (void)viewDidUnload
- (void)dealloc
Para obtener más información, consulte la Referencia de clase UIViewController .
fuente
Los métodos
viewWillLayoutSubviews
yviewDidLayoutSubviews
no se mencionan en los diagramas, pero estos se llaman entreviewWillAppear
yviewDidAppear
. Se les puede llamar varias veces.fuente
La respuesta de Haider es correcta para pre-iOS 6. Sin embargo, a partir de iOS 6 nunca se llama a viewDidUnload y viewWillUnload. Los documentos indican: "Las vistas ya no se purgan en condiciones de poca memoria, por lo que este método nunca se llama".
fuente
Aquí hay mucha información obsoleta e incompleta. Solo para iOS 6 y versiones posteriores :
loadView
[una]viewDidLoad
[una]viewWillAppear
viewWillLayoutSubviews
es la primera vez que se finalizan los límitesviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[si]*
viewDidLayoutSubviews
[si]Notas al pie:
(a) - Si cierra manualmente su vista durante
didReceiveMemoryWarning
,loadView
yviewDidLoad
se le volverá a llamar. Es decir, de forma predeterminadaloadView
yviewDidLoad
solo se llama una vez por instancia de controlador de vista.(b) Puede llamarse un 0 o más veces adicionales .
fuente
viewWillLayoutSubviews
yviewDidLayoutSubviews
también se llamará en otros momentos cuando se cargan subvistas de la vista principal, por ejemplo, cuando se cargan las celdas de una vista de tabla o vista de colección.Explicando las transiciones de estado en el documento oficial: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Esta imagen muestra las transiciones de estado válidas entre varios métodos de devolución de llamada 'will' y 'did'
Transiciones de estado válidas:
Tomado de: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Class Reference_2x.png
fuente
Según el documento de Apple - Comience a desarrollar aplicaciones de iOS (Swift) - Trabaje con controladores de vista - Comprenda el ciclo de vida del controlador de vista
fuente