Você poderia me explicar a maneira correta de gerenciar o UIViewController
ciclo de vida?
Em particular, eu gostaria de saber como usar Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
e Dispose
métodos em Mono Touch para uma UIViewController
classe.
ios
uiviewcontroller
xamarin.ios
lifecycle
Lorenzo B
fonte
fonte
Respostas:
Todos esses comandos são chamados automaticamente nos momentos apropriados pelo iOS quando você carrega / apresenta / oculta o controlador de exibição. É importante observar que esses métodos estão associados
UIViewController
e não aUIView
si mesmos. Você não obterá nenhum desses recursos apenas usando aUIView
.Há uma excelente documentação no site da Apple aqui . Colocando simplesmente, porém:
ViewDidLoad
- Chamado quando você cria a classe e carrega do xib. Ótimo para configuração inicial e trabalho único.ViewWillAppear
- Chamado logo antes da exibição da sua exibição, bom para ocultar / mostrar campos ou qualquer operação que você deseje que ocorra sempre que a exibição estiver visível. Como você pode alternar entre visualizações, isso será chamado sempre que sua visualização estiver prestes a aparecer na tela.ViewDidAppear
- Chamado após a exibição da exibição - ótimo lugar para iniciar animações ou carregar dados externos de uma API.ViewWillDisappear
/DidDisappear
- Mesma ideia queViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- No Objective-C, é aqui que você faz a limpeza e a liberação de material, mas isso é tratado automaticamente, de modo que você não precisa fazer muito aqui.fonte
ATUALIZAÇÃO: O ViewDidUnload foi descontinuado no iOS 6, portanto, atualizei a resposta.
O ciclo de vida do UIViewController é diagramado aqui:
A vantagem de usar o Xamarin Native / Mono Touch é que ele usa as APIs nativas e, portanto, segue o mesmo ciclo de vida do ViewController que você encontraria na documentação da Apple.
fonte
Esta é a versão mais recente do iOS (modificada com Xcode 9.3, Swift 4.1 ). Abaixo estão todos os estágios que tornam o ciclo de vida
UIViewController
completo.loadView()
loadViewIfNeeded()
viewDidLoad()
viewWillAppear(_ animated: Bool)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_ animated: Bool)
viewWillDisappear(_ animated: Bool)
viewDidDisappear(_ animated: Bool)
Deixe-me explicar todas essas etapas.
1
loadView
Este evento cria / carrega a visualização que o controlador gerencia. Ele pode carregar de um arquivo de ponta associado ou vazio
UIView
se nulo foi encontrado. Isso torna um bom lugar para criar suas visualizações no código programaticamente.2)
loadViewIfNeeded
Se a visualização da corrente
viewController
ainda não foi definida, esse método carregará a visualização, mas lembre-se de que isso estará disponível apenas no iOS> = 9.0. Portanto, se você suporta o iOS <9.0, não espere que ele entre em cena.3)
viewDidLoad
O
viewDidLoad
evento é chamado apenas quando a visualização é criada e carregada na memória, mas os limites da visualização ainda não estão definidos. Este é um bom lugar para inicializar os objetos que o controlador de exibição usará.4)
viewWillAppear
Este evento notifica
viewController
sempre que a exibição aparece na tela. Nesta etapa, a vista possui limites definidos, mas a orientação não está definida.5)
viewWillLayoutSubviews
Esta é a primeira etapa do ciclo de vida em que os limites são finalizados. Se você não estiver usando restrições ou Layout automático, provavelmente desejará atualizar as subvisões aqui. Isso está disponível apenas no iOS> = 5.0. Portanto, se você suporta o iOS <5.0, não espere que ele entre em cena.
6
viewDidLayoutSubviews
Este evento notifica o controlador de exibição que as subvisões foram configuradas. É um bom lugar para fazer alterações nas subvisões depois que elas foram definidas. Isso está disponível apenas no iOS> = 5.0. Portanto, se você suporta o iOS <5.0, não espere que ele entre em cena.
7)
viewDidAppear
O
viewDidAppear
evento é acionado depois que a visualização é apresentada na tela. O que o torna um bom local para obter dados de um serviço de back-end ou banco de dados.8)
viewWillDisappear
O
viewWillDisappear
evento é acionado quando a exibição apresentadaviewController
está prestes a desaparecer, descartar, encobrir ou ocultar atrás de outraviewController
. Este é um bom lugar para restringir as chamadas de rede, invalidar o timer ou liberar objetos vinculados a issoviewController
.9
viewDidDisappear
Esta é a última etapa do ciclo de vida que qualquer pessoa pode abordar, pois esse evento é acionado logo após a exibição da apresentação
viewController
ter sido desaparecida, descartada, coberta ou oculta.Agora, de acordo com a Apple, ao implementar esses métodos, lembre-se de chamar a
super
implementação desse método específico.Espero que isso tenha ajudado. Obrigado.
UPDATE - Como @ThomasW apontou no comentário
viewWillLayoutSubviews
eviewDidLayoutSubviews
também será chamado em outros momentos quando subvistas da vista principal são carregadas, por exemplo, quando células de uma exibição de tabela ou coleção são carregadas.ATUALIZAÇÃO - Como @Maria apontou dentro do comentário, a descrição de
loadView
foi atualizadafonte
viewWillLayoutSubviews
eviewDidLayoutSubviews
também será chamado em outros momentos quando as subvisões da visualização principal forem carregadas, por exemplo, quando as células de uma visualização de tabela ou de coleção forem carregadas.viewWillAppear
viewDidAppear
viewDidDisappear
. Você deve chamar super em algum momento.iOS 10,11 (Swift 3.1, Swift 4.0)
De acordo com
UIViewController
aUIKit
desenvolvedores,1. loadView ()
É aqui que as subclasses devem criar sua hierarquia de exibição personalizada se não estiverem usando uma ponta . Nunca deve ser chamado diretamente.
2. loadViewIfNeeded ()
Carrega a visualização do controlador de visualização, se ainda não tiver sido definida.
3. viewDidLoad ()
Chamado após o carregamento da visualização. Para os controladores de exibição criados no código, isso é pós-loadView. Para controladores de exibição desarquivados de uma ponta, isso ocorre depois que a exibição é configurada.
4. viewWillAppear (_ animado: Bool)
Chamado quando a exibição está prestes a se tornar visível. O padrão não faz nada
5. viewWillLayoutSubviews ()
Chamado imediatamente antes do método layoutSubviews da visualização do controlador de exibição ser chamado. As subclasses podem ser implementadas conforme necessário. O padrão não faz nada.
6. viewDidLayoutSubviews ()
Chamado logo após o método layoutSubviews da visualização do controlador de exibição ser chamado. As subclasses podem ser implementadas conforme necessário. O padrão não faz nada.
7. viewDidAppear (_ animado: Bool)
Chamado quando a visualização foi totalmente transferida para a tela. O padrão não faz nada
8. viewWillDisappear (_ animado: Bool)
Chamado quando a exibição é descartada, coberta ou oculta. O padrão não faz nada
9. viewDidDisappear (_ animado: Bool )
Chamado depois que a vista foi descartada, coberta ou oculta de outra forma. O padrão não faz nada
10. viewWillTransition (no tamanho: CGSize, com coordenador: UIViewControllerTransitionCoordinator)
Chamado quando a exibição está em transição.
11. willMove (pai toParentViewController: UIViewController?)
12. didMove (pai toParentViewController: UIViewController?)
Esses dois métodos são públicos para que as subclasses de contêiner chamem ao fazer a transição entre controladores filhos. Se eles forem substituídos, as substituições devem garantir a chamada de super.
O argumento pai em ambos os métodos é nulo quando um filho está sendo removido de seu pai; caso contrário, é igual ao novo controlador de exibição pai.
13. didReceiveMemoryWarning ()
Chamado quando o aplicativo pai recebe um aviso de memória. No iOS 6.0, ele não limpa mais a exibição por padrão.
fonte
nib
como mencionado abaixoloadView
?viewWillLayoutSubviews()
é chamado antes que o objeto de exibição do ViewController invoque seulayoutSubviews()
métodoA partir do iOS 6 em diante. O novo diagrama é o seguinte:
fonte
Vamos nos concentrar nos métodos responsáveis pelo ciclo de vida do UIViewController :
Criação:
- (void)init
- (void)initWithNibName:
Ver criação:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
Tratamento da alteração do estado da exibição:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
Tratamento de aviso de memória:
- (void)didReceiveMemoryWarning
Desalocação
- (void)viewDidUnload
- (void)dealloc
Para obter mais informações, consulte a Referência de classe UIViewController .
fonte
Os métodos
viewWillLayoutSubviews
eviewDidLayoutSubviews
não são mencionados nos diagramas, mas são chamados entreviewWillAppear
eviewDidAppear
. Eles podem ser chamados várias vezes.fonte
A resposta de Haider está correta no pré-iOS 6. No entanto, a partir do iOS 6, viewDidUnload e viewWillUnload nunca são chamados. Os documentos afirmam: "As visualizações não são mais eliminadas em condições de pouca memória e, portanto, esse método nunca é chamado".
fonte
Há muitas informações desatualizadas e incompletas aqui. Apenas para iOS 6 e versões mais recentes :
loadView
[uma]viewDidLoad
[uma]viewWillAppear
viewWillLayoutSubviews
é a primeira vez que os limites são finalizadosviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[b]*
viewDidLayoutSubviews
[b]Notas de rodapé:
(a) - Se você nil manualmente o seu ponto de vista durante
didReceiveMemoryWarning
,loadView
eviewDidLoad
será chamado novamente. Ou seja, por padrãoloadView
eviewDidLoad
só é chamado uma vez por instância do controlador de exibição.(b) Pode ser chamado de 0 ou mais vezes.
fonte
viewWillLayoutSubviews
eviewDidLayoutSubviews
também será chamado em outros momentos quando as subvisões da visualização principal forem carregadas, por exemplo, quando as células de uma visualização de tabela ou de coleção forem carregadas.Explicando as transições de estado no documento oficial: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Esta imagem mostra as transições de estado válidas entre vários métodos de retorno de chamada 'will' e 'did'
Transições de estado válidas:
Retirado de: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Referência de Classe_2x.png
fonte
Conforme o documento da Apple - Comece a desenvolver aplicativos iOS (Swift) - Trabalhe com os controladores de exibição - Compreenda o ciclo de vida do controlador de exibição
fonte