¿Podría explicarme la forma correcta de administrar el UIViewControllerciclo de vida?
En particular, me gustaría saber cómo utilizar Initialize, ViewDidLoad, ViewWillAppear, ViewDidAppear, ViewWillDisappear, ViewDidDisappear, ViewDidUnloady Disposemétodos en Mono táctil para una UIViewControllerclase.
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
UIViewControllery no aUIViewellos 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
UIViewControllercompleto.loadView()loadViewIfNeeded()viewDidLoad()viewWillAppear(_ animated: Bool)viewWillLayoutSubviews()viewDidLayoutSubviews()viewDidAppear(_ animated: Bool)viewWillDisappear(_ animated: Bool)viewDidDisappear(_ animated: Bool)Déjame explicarte todas esas etapas.
1)
loadViewEste evento crea / carga la vista que administra el controlador. Se puede cargar desde un archivo nib asociado o un vacío
UIViewsi se encontró nulo. Esto lo convierte en un buen lugar para crear sus vistas en código mediante programación.2)
loadViewIfNeededSi
viewControlleraú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)
viewDidLoadEl
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 usará el controlador de vista.4)
viewWillAppearEste evento notifica
viewControllercuando aparece la vista en la pantalla. En este paso, la vista tiene límites definidos pero la orientación no está establecida.5)
viewWillLayoutSubviewsEste 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)
viewDidLayoutSubviewsEste 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)
viewDidAppearEl
viewDidAppearevento 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)
viewWillDisappearEl
viewWillDisappearevento se dispara cuando se presenta la vistaviewControllerestá 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)
viewDidDisappearEste 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
viewControllerha desaparecido, descartado, cubierto u oculto.Ahora, según Apple, cuando implemente estos métodos, recuerde llamar a la
superimplementación de ese método específico.Espero que esto haya ayudado. Gracias.
ACTUALIZACIÓN : como @ThomasW señaló dentro del comentario
viewWillLayoutSubviewsyviewDidLayoutSubviewstambié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,
loadViewse actualizó la descripción defuente
viewWillLayoutSubviewsyviewDidLayoutSubviewstambié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.viewWillAppearviewDidAppearviewDidDisappear. Debes llamar super en algún momento.iOS 10,11 (Swift 3.1, Swift 4.0)
De acuerdo con
UIViewControllerenUIKitlos 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
nibcomo 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 *)coderManejo 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)viewDidUnloadManejo de advertencia de memoria:
- (void)didReceiveMemoryWarningDesasignación
- (void)viewDidUnload- (void)deallocPara obtener más información, consulte la Referencia de clase UIViewController .
fuente
Los métodos
viewWillLayoutSubviewsyviewDidLayoutSubviewsno se mencionan en los diagramas, pero estos se llaman entreviewWillAppearyviewDidAppear. 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]viewWillAppearviewWillLayoutSubviewses la primera vez que se finalizan los límitesviewDidLayoutSubviewsviewDidAppear*viewWillLayoutSubviews[si]*viewDidLayoutSubviews[si]Notas al pie:
(a) - Si cierra manualmente su vista durante
didReceiveMemoryWarning,loadViewyviewDidLoadse le volverá a llamar. Es decir, de forma predeterminadaloadViewyviewDidLoadsolo se llama una vez por instancia de controlador de vista.(b) Puede llamarse un 0 o más veces adicionales .
fuente
viewWillLayoutSubviewsyviewDidLayoutSubviewstambié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