Sobes.tech
Middle

Fale sobre os ciclos de vida do controlador e como eles são chamados.

sobes.tech IA

Resposta da IA

O ciclo de vida de UIViewController inclui métodos que são chamados em momentos específicos da sua existência: desde a criação até à destruição.

Principais métodos do ciclo de vida:

  1. viewDidLoad():

    • É chamado após a vista do controlador ter sido carregada na memória, mas antes de ser exibida na tela.
    • Usado para inicializar dados, configurar elementos de UI que não dependem da geometria da vista.
    • É chamado apenas uma vez durante a vida do controlador.
  2. viewWillAppear(_ animated: Bool):

    • É chamado imediatamente antes da vista do controlador aparecer na tela.
    • Usado para realizar tarefas que devem acontecer sempre que a vista se torna visível (por exemplo, atualizar dados, animações).
    • Pode ser chamado várias vezes.
  3. viewDidAppear(_ animated: Bool):

    • É chamado após a vista do controlador ter aparecido completamente na tela e estar visível para o utilizador.
    • Adequado para iniciar animações ou outras tarefas que requerem que a vista esteja totalmente pronta.
    • Pode ser chamado várias vezes.
  4. viewWillDisappear(_ animated: Bool):

    • É chamado imediatamente antes da vista do controlador ser removida da tela (por exemplo, ao navegar para outra vista).
    • Usado para guardar o estado ou parar tarefas que não devem continuar enquanto a vista não estiver visível (por exemplo, parar temporizadores).
    • Pode ser chamado várias vezes.
  5. viewDidDisappear(_ animated: Bool):

    • É chamado após a vista do controlador ter sido completamente removida da tela.
    • Usado para libertar recursos ou parar tarefas que não são necessárias quando a vista não está visível.
    • Pode ser chamado várias vezes.
  6. viewWillLayoutSubviews():

    • É chamado antes do controlador começar a dispor as suas subviews.
    • Usado para fazer alterações nas restrições ou quadros antes da auto-layout.
    • Pode ser chamado várias vezes.
  7. viewDidLayoutSubviews():

    • É chamado após o controlador ter terminado de dispor as suas subviews.
    • Usado para realizar tarefas que dependem dos tamanhos finais das subviews (por exemplo, configurar indicadores de scroll ou sombras).
    • Pode ser chamado várias vezes.
  8. didReceiveMemoryWarning():

    • É chamado em caso de memória RAM baixa.
    • Usado para libertar recursos que podem ser recriados mais tarde.
  9. deinit:

    • É chamado imediatamente antes do objeto UIViewController ser destruído e libertado da memória.
    • Usado para realizar limpeza final, como remover observadores ou fechar conexões de rede.

Ordem de chamada:

Ordem típica de métodos ao aparecer o controlador:

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

Ordem típica de métodos ao desaparecer o controlador:

  1. viewWillDisappear(_ animated: Bool)
  2. viewDidDisappear(_ animated: Bool)
  3. deinit (se o controlador já não for necessário)

Exemplo de implementação:

import UIKit

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Configuração de UI, inicialização de dados
        print("viewDidLoad")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Atualização de UI antes de aparecer
        print("viewWillAppear")
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // A vista apareceu, iniciar animações
        print("viewDidAppear")
    }

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

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        // A vista desapareceu, limpeza
        print("viewDidDisappear")
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        // Antes do auto layout
        print("viewWillLayoutSubviews")
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        // Depois do auto layout
        print("viewDidLayoutSubviews")
    }

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