Sobes.tech
Middle

Cuéntame sobre los ciclos de vida del controlador y cómo se llaman.

sobes.tech AI

Respuesta de la IA

El ciclo de vida de UIViewController incluye métodos que se llaman en momentos específicos de su existencia: desde la creación hasta la destrucción.

Métodos principales del ciclo de vida:

  1. viewDidLoad():

    • Se llama después de que la vista del controlador ha sido cargada en memoria, pero antes de que se muestre en la pantalla.
    • Se usa para inicializar datos, configurar elementos de la interfaz de usuario que no dependen de la geometría de la vista.
    • Solo se llama una vez durante la vida del controlador.
  2. viewWillAppear(_ animated: Bool):

    • Se llama justo antes de que la vista del controlador aparezca en la pantalla.
    • Se usa para realizar tareas que deben ocurrir cada vez que la vista se vuelve visible (por ejemplo, actualizar datos, animaciones).
    • Puede llamarse varias veces.
  3. viewDidAppear(_ animated: Bool):

    • Se llama después de que la vista del controlador ha aparecido completamente en la pantalla y es visible para el usuario.
    • Es adecuado para iniciar animaciones u otras tareas que requieren que la vista esté completamente lista.
    • Puede llamarse varias veces.
  4. viewWillDisappear(_ animated: Bool):

    • Se llama justo antes de que la vista del controlador sea eliminada de la pantalla (por ejemplo, al navegar a otra pantalla).
    • Se usa para guardar el estado o detener tareas que no deben continuar mientras la vista no es visible (por ejemplo, detener temporizadores).
    • Puede llamarse varias veces.
  5. viewDidDisappear(_ animated: Bool):

    • Se llama después de que la vista del controlador ha sido completamente eliminada de la pantalla.
    • Se usa para limpiar recursos o detener tareas que no son necesarias cuando la vista no es visible.
    • Puede llamarse varias veces.
  6. viewWillLayoutSubviews():

    • Se llama antes de que el controlador comience a colocar sus subviews.
    • Se usa para hacer cambios en las restricciones o marcos antes de que se realice la auto-layout.
    • Puede llamarse varias veces.
  7. viewDidLayoutSubviews():

    • Se llama después de que el controlador ha terminado de colocar sus subviews.
    • Se usa para realizar tareas que dependen de los tamaños finales de los subviews (por ejemplo, configurar indicadores de desplazamiento o sombras).
    • Puede llamarse varias veces.
  8. didReceiveMemoryWarning():

    • Se llama en caso de bajo nivel de memoria RAM.
    • Se usa para liberar recursos que pueden ser recreados más tarde.
  9. deinit:

    • Se llama justo antes de que el objeto UIViewController sea destruido y liberado de la memoria.
    • Se usa para realizar limpieza final, como eliminar observadores o cerrar conexiones de red.

Orden de llamada:

Orden típico de los métodos al aparecer el controlador:

  1. viewDidLoad()
  2. viewWillAppear(_ animated: Bool)
  3. viewWillLayoutSubviews()
  4. viewDidLayoutSubviews()
  5. viewDidAppear(_ animated: Bool)

Orden típico de los métodos al desaparecer el controlador:

  1. viewWillDisappear(_ animated: Bool)
  2. viewDidDisappear(_ animated: Bool)
  3. deinit (si el controlador ya no es necesario)

Ejemplo de implementación:

import UIKit

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Configuración de UI, inicialización de datos
        print("viewDidLoad")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Actualización de UI antes de aparecer
        print("viewWillAppear")
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // La vista apareció, iniciar animaciones
        print("viewDidAppear")
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // Prepararse para desaparecer, guardar estado
        print("viewWillDisappear")
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        // La desaparición terminó, limpiar
        print("viewDidDisappear")
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        // Antes de la auto-layout
        print("viewWillLayoutSubviews")
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        // Después de la auto-layout
        print("viewDidLayoutSubviews")
    }

    deinit {
        // Limpieza de recursos
        print("deinit")
    }
}