Diferencia entre viewDidLoad y viewDidAppear

Respuestas:

147

viewDidLoadse llama exactamente una vez, cuando el controlador de vista se carga por primera vez en la memoria. Aquí es donde desea crear una instancia de las variables de instancia y crear las vistas que vivan durante todo el ciclo de vida de este controlador de vistas. Sin embargo, la vista todavía no es visible en este punto.

viewDidAppearse llama cuando la vista es realmente visible y se puede llamar varias veces durante el ciclo de vida de un controlador de vista (por ejemplo, cuando se descarta un controlador de vista modal y la vista vuelve a ser visible). Aquí es donde desea realizar cualquier acción de diseño o hacer cualquier dibujo en la interfaz de usuario, por ejemplo, presentar un controlador de vista modal. Sin embargo, todo lo que haga aquí debería ser repetible. Es mejor no retener cosas aquí, o de lo contrario obtendrá pérdidas de memoria si no las libera cuando la vista desaparece.

Ver: https://developer.apple.com/documentation/uikit/uiviewcontroller

Davidgoli
fuente
15
Tú y WrightsCS tienen toda la razón. Pero, no para dividir los pelos, pero si bien viewDidLoadgeneralmente solo se llama una vez y solo una vez, hay una situación en la que se puede llamar nuevamente. Específicamente, si alguna vez recibe un mensaje didReceiveMemoryWarning, sus vistas no visibles pueden ser liberadas (aunque los controladores de vista están intactos) y cuando regrese, es viewDidLoadposible que se le solicite nuevamente.
Rob
1
No estoy seguro de si estoy de acuerdo con el comentario acerca de que los ivars del controlador de vista siempre se liberan automáticamente para usted (el controlador en sí no se libera). Sospecho que ambos podríamos construir fácilmente un viewDidLoad que se filtraría si se volviera a invocar después de un didReceiveMemoryWarning. Pero estoy de acuerdo en que si emplea buenas prácticas al escribir su viewDidLoad, debería estar bien. Mi único punto es que el uso descuidado de ivars y la administración manual de la memoria definitivamente pueden resultar en fugas viewDidLoad. Las personas deben ser sensibles al didReceiveMemoryWarningescenario y programar en consecuencia.
Rob
2
Para no insistir en el punto, pero menos de 24 horas después de este intercambio, mientras respondía otra pregunta , encontré un ejemplo de precisamente el tipo de viewDidLoadcódigo que se filtrará didReceiveMemoryWarning. Suspiro.
Rob
1
Esta respuesta contradice directamente esta otra: stackoverflow.com/a/3411636/269753 He estado observando que mi método viewDidLoad se llama más de una vez, incluso cuando no recibe advertencias de memoria en absoluto. ¿Alguien quiere aclarar?
Ricardo Sanchez-Saez
2
No veo que haya una contradicción. Esa pregunta es sobre la relación entre viewDidLoad y viewDidUnload, no viewDidAppear.
davidgoli
21

En pocas palabras, querrá crear controles o matrices en viewDidLoad, donde como en viewDidAppeares donde desearía actualizar esos controles o matrices.

viewDidLoadse llama una vez cuando se crea el controlador y viewDidAppearse llama cada vez que aparece la vista, bueno, DID. Entonces, digamos que tiene una vista modal que presenta, cuando esa vista se descarta, viewDidAppearse llamará y viewDidLoadno se llamará.

WrightsCS
fuente
3
El primer párrafo es un buen consejo. Pero el segundo párrafo es incorrecto. viewDidLoadse puede llamar más de una vez . Si su vista mientras no se muestra (debajo de una pila de otras vistas) es descargada por versiones anteriores de iOS en una situación de poca memoria, entonces el controlador de vista recargará automáticamente la vista cuando sea necesario volver a mostrarla en la pantalla. En versiones posteriores de iOS, puede optar por ayudar a reducir el uso de memoria haciendo lo que iOS hizo anteriormente por usted: descargar las vistas fuera de la pantalla cuando didReceiveMemoryWarningllegue el mensaje, en cuyo caso se viewDidLoadvolverá a llamar.
Basil Bourque
@WrightsCS, ¿tienes algún documento oficial de Apple que diga eso? "viewDidLoad se llama una vez cuando se crea el controlador" Porque recuerdo que en el pasado, viewDidLoad se podía llamar varias veces en escenarios de poca memoria. Muchas gracias.
Ricardo