2012-06-29 24 views
63

¿Cuál es la diferencia entre viewDidLoad y viewDidAppear? ¿Qué tipo de inicialización o código personalizado entra en esas funciones?Diferencia entre viewDidLoad y viewDidAppear

p. Ej. presentModalViewController funciona solo cuando está presente en viewDidAppear y no en viewDidLoad.

+0

Ver [UIViewController. viewDidLoad vs. viewWillAppear: ¿Cuál es la división del trabajo adecuada?] (http://stackoverflow.com/questions/1579550/uiviewcontroller-viewdidload-vs-viewwillappear-what-is-the-proper-division-of) –

Respuesta

118

viewDidLoad se llama exactamente una vez, cuando el controlador de vista se carga por primera vez en la memoria. Aquí es donde desea crear instancias de variables de instancia y crear vistas que vivan durante todo el ciclo de vida de este controlador de vista. Sin embargo, la vista no suele ser visible en este momento.

viewDidAppear se llama cuando la vista es realmente visible, y se puede invocar varias veces durante el ciclo de vida de un Controlador de Vista (por ejemplo, cuando un Controlador de Vista Modal se descarta 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, presentando un controlador de vista modal. Sin embargo, cualquier cosa que hagas aquí debe ser repetible. Lo mejor es no retener las cosas aquí, de lo contrario obtendrá pérdidas de memoria si no las libera cuando la vista desaparece.

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

+11

Usted y WrightsCS tienen toda la razón. Pero no para dividir el pelo, pero mientras 'viewDidLoad' generalmente solo se llama una vez y solo una vez, hay una situación en la que se puede volver a llamar. Específicamente, si alguna vez recibe un 'didReceiveMemoryWarning', sus vistas no visibles pueden ser liberadas (aunque los controles de vista permanecen intactos) y cuando regrese,' viewDidLoad' puede ser llamado de nuevo. – Rob

+0

Eso es cierto, pero en ese caso, se lanzarán todos los ivars retenidos, por lo que es seguro reiniciarlos ... pero si conserva un ivar en viewDidAppear y no lo suelta en viewDidDisappear, es probable que obtenga un recuerdo fugas si está presionando otros controladores de vista sobre el actual. – davidgoli

+1

No estoy seguro de si estoy de acuerdo con el comentario sobre la visualización de controladores siempre y de forma automática para usted (el controlador en sí no se ha lanzado). 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 dar lugar a fugas en 'viewDidLoad'. Las personas deberían ser sensibles al escenario y al programa 'didReceiveMemoryWarning' en consecuencia. – Rob

18

En pocas palabras, usted querrá crear cualquier control o matriz en viewDidLoad, donde como en viewDidAppear es donde desea actualizar esos controles o matrices.

viewDidLoad se llama una vez cuando se crea el controlador y viewDidAppear se llama cada vez que la vista, así, apareció. Así que supongamos que tiene una vista modal que presente; cuando se descarte esa vista, se invocará viewDidAppear, y no se invocará viewDidLoad.

+3

Primer párrafo es un buen consejo. Pero el segundo párrafo es incorrecto. 'viewDidLoad' se puede * llamar más de una vez *. Si su vista, aunque no se muestra (en una pila de otras vistas), es descargada por versiones anteriores de iOS en una situación de poca memoria, entonces el controlador de vista volverá a cargar 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 la memoria haciendo lo que antes hacía iOS para usted: descargue las vistas fuera de pantalla cuando llegue el mensaje 'didReceiveMemoryWarning', en cuyo caso se llamará de nuevo al' viewDidLoad'. –

+0

@WrightsCS ¿tiene 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 situaciones de poca memoria. Muchas gracias. – Ricardo

+0

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLoad – WrightsCS