Acerca de los methods "viewDidLoad" y "viewWillAppear" de viewController

Tengo una pregunta sobre los dos methods mencionados, ya que en mis exámenes no aclaro el order en que se llaman. Pensé que, en primer lugar, se llama a viewDidLoad cuando viewController se carga por primera vez (como su nombre lo indica) e inmediatamente después del método init. Entonces, pensé que una vez que viewDidLoad regrese, se llamará a viewWillAppear . Si muestra otro viewController y luego regresa a este, entonces ya debería estar cargado y solo se viewWillAppear .

Sin embargo, durante el desarrollo, tengo la printing de que no hay order al llamar a viewDidLoad y viewWillAppear … No pude encontrar una descripción clara de este ciclo de vida en la documentation de Apple, ¿cómo funciona esto realmente?

¡Gracias!

Me gustaría agregar a la respuesta de Caleb: ¡No confundas el controller de vista y la vista! El nombre viewDidLoad indica claramente que el método se invoca después de que se ha cargado la vista . Es el controller de vista el que realiza la carga.

Algunos consejos sobre el ciclo de vida de las vistas y el order en que se envían los posts:

  • No es un documento oficial de Apple, pero encuentro que este diagtwig es realmente útil porque incluye casi todas las UIViewController del ciclo de vida de UIViewController .
  • En la sección Gestión de resources en los controlleres de vista de Apple, "Ver la Guía de progtwigción del controller", hay un diagtwig de flujo que muestra cómo se cargan inicialmente las vistas. Explica loadView y viewDidLoad , también en conjunción con storyboards.
  • La sección Cómo responder a notifications relacionadas con la visualización en la "Guía de progtwigción del controller de la vista" de Apple explica cómo responder a las vistas que aparecen y desaparecen ( viewWillAppear: et al)
  • Si planea implementar un controller de vista de contenedor: La reference de class de UIViewController tiene una buena descripción de cómo la subclass debe enviar los posts.

Me detengo aqui Puede encontrar más cosas buscando en Google "ciclo de vida uiviewcontroller".

-viewDidLoad se -viewDidLoad cuando el controller carga su vista, que no necesariamente es correcta después de la initialization. Los controlleres de vista no cargan sus vistas hasta que las necesiten, ya sea para mostrarlas o por cualquier otro motivo.

-viewWillAppear se llama justo antes de que se muestre la vista. Esto será después de -viewDidLoad , pero no sabes exactamente cuánto time después. -viewWillAppear se llama cada vez que se muestra la vista; -viewDidLoad solo se llamará por segunda vez si la vista se descarga en algún momento (como didReceiveMemoryWarning ). En estos días eso es inusual, pero puede suceder.

O si viewController se establece en nil , lo que generalmente puede suceder si un controller de vista se inicia en la stack de navigation y, por lo tanto, la próxima vez que se lleva a la stack de navigation, debe volver a llamar a -viewDidLoad .

Pensé que, en primer lugar, se llama a viewDidLoad cuando viewController se carga por primera vez (como su nombre lo indica) e inmediatamente después del método init

No. El nombre indica que la view del controller se ha cargado (no el controller en sí). En realidad, los documentos establecen que este método se llamará después de que la jerarquía de vista se haya cargado en la memory (ya sea a través de loadView o a través de una punta, por ejemplo).

Entonces, pensé que una vez que viewDidLoad regresa, se llama a viewWillAppear

De nuevo, no. loadView (y como consecuencia viewDidLoad ) se llamará la primera vez que se tiene acceso a la propiedad view y es nil (es el caso cuando se inicializa un controller). Piensa en este simple escenario:

 MyViewController *vc = [[MyViewController alloc] init]; UIView *view = vc.view; // <= loadView & viewDidLoad will fire but it certainly didn't appear... 

Sin embargo, durante el desarrollo, me da la printing de que no hay order al llamar a viewDidLoad y viewWillAppear …

Bueno, hay un pedido. Sabemos con certeza que siempre se llamará a viewDidLoad después de viewDidLoad (si ambos deben llamarse, por supuesto).

Como usted dijo, ViewDidLoad solo llama una vez después de cargar la vista. Entonces podemos inicializar las instancias en viewDidLoad . Está destinado principalmente a la initialization.

viewWillAppear invocará cada vez que scopemos esta vista. Entonces, si hay algún cambio en la interfaz de usuario, podemos hacerlo en viewWillAppear .

Corrí un rastreo cuando se hicieron todas estas llamadas: http://thecodist.com/article/ios_arc_storyboards_and_uiviewcontroller_trace