Entendendo o Ciclo de Vida de uma View Controller
- #Swift
E aí, pessoal!
Hoje vou falar um pouco sobre um assunto que é frequentemente abordado em entrevistas de emprego para desenvolvedores juniores: o ciclo de vida de uma view controller.
Entender o ciclo de vida de uma View Controller é fundamental para o desenvolvimento eficaz de aplicativos iOS, permitindo que os desenvolvedores controlem o comportamento das telas, otimizem o desempenho do aplicativo e forneçam uma experiência de usuário suave e confiável.
viewDidLoad(), viewWillAppear(_:), viewDidAppear(_:), viewWillDisappear(_:) e viewDidDisappear(_:) são funções do objeto UIViewController e podem ser usadas por herança.
Já as funções init e deinit são métodos de classes e structs que estão relacionados à inicialização e à desinicialização destes.
Todos os métodos (os de inicialização e os de view) existem e já são usados pelo iOS. O que fazemos é como uma customização. Por exemplo, você pode usar o viewWillAppear e configurar algo da sua tela no escopo dessa função. Mas mesmo não usando, e nem colocando essa função na sua viewcontroller, ela continua existindo no objeto UIViewController que sua class herda.
Etapa 1. init(coder:) e init(nibName:bundle:) - A criação da View Controller:
Quando uma View Controller é criada, o sistema invoca um dos construtores init. O init(coder:) é usado quando a View Controller é criada a partir de um arquivo de interface (Storyboard), enquanto o init(nibName:bundle:) é usado quando a controller é criada por código, seja ela uma view code ou xib (o que importa é como ela é criada, e não a forma de seu próprio layout).
Quando o init é chamado, a ViewController é inicializada, mas a view real ainda não foi carregada.
Quando usar o init?
Quando a sua viewController precisar de um determinado dado para existir. Por exemplo, você tem uma controller de edição de dados de um usuário. Logo, obrigatoriamente, essa viewController precisa dos dados desse usuário, ou de um id, para ela poder existir. Entao nesse caso o recomendado é passar essa dado pelo init.
Outro exemplo, uma tela de transferencia de pix. Ela precisa para poder existir do pix do recebedor e do valor, logo, como são informações necessárias para a existência dessa tela, que sem essas informações ela nao tem como funcionar, então você passa pelo init.
Importante lembrar que nesse momento de init não se pode mudar o valor de propriedade de outlets como o text de um textField, porque esse outlet ainda não foi criado.
Etapa 2. viewDidLoad() - Configurações Iniciais:
Após a view da View Controller ser instanciada, o método viewDidLoad() é chamado. Esse método é chamado uma única vez durante todo o tempo de vida da controller.
Essa função é ideal para configurar os outlets que foram setados no init, definindo cores, textos, sombras, etc e, também, para chamar elementos que só precisam ser chamados uma única vez no código, como por exemplo, setup da tableView, pickerView, chamada de API (caso esteja usando MVC).
Ponto de atenção:
Não faça lógica usando frame na viewDidLoad(), deixe para fazê-la na viewWillAppear, porque porque nesse momento o frame ainda não tem tamanho correto (tamanho da tela do dispositivo que está sendo utilizado).
Etapa 3. viewWillAppear(_:) - Preparando-se para a Aparição:
Esse método é chamado todas as vezes que a uma tela é aberta. Seja quando ela é criada, mas também quando uma tela é fechada e volta-se nela. Por exemplo, abrimos a tela A e depois a B. Quando fecharmos a tela B, vai cair no willAppear da tela A pois ela “vai aparecer” novamente
Método ideal para fazer chamada de API que precisam de estar atualizadas, por exemplo, saldo de banco (toda vez que a tela está aparecendo o saldo do banco precisa estar atualizado).
Etapa 4. viewDidAppear(_:) - View está Aparecendo:
Método chamado quando a View está aparecendo na tela do usuário.
Aqui é o lugar para chamar ações que devem ser executadas somente quando a tela estiver aparecendo, como animações, contagem de timer, etc.
Etapa 5. viewWillDisappear(_:) - View deixará de estar Aparente:
Antes da View Controller desaparecer, seja por transição ou empilhamento, viewWillDisappear(_:) é chamado. É um bom momento para salvar dados ou configurar para uma transição suave.
Quando a view não está mais visível, viewDidDisappear(_:) é acionado.
Etapa 6. viewDidDisappear(_:) - View deixou de estar Aparente:
Chamado toda vez que a view acabar de desaparecer da tela.
Tanto o willDisappear() quanto o didDisappear() não são muito utilizados.
Etapa 7. deinit - O Fim da Jornada:
O método deinit é chamado pouco antes da View Controller ser destruída. É o último ponto antes de a instância da View Controller ser liberada da memória. É aqui que você deve fazer a limpeza e liberar recursos comoremover observadores e invalidar timers para não criar retain cycle.