Na WWDC 2011 Sessão 102, a Apple introduziu View Controller contenção, que é a capacidade de criar recipientes controlador de exibição personalizada, análogo a UITabBarController
, UINavigationController
e afins.
Assisti aos exemplos várias vezes. Há uma enxurrada de métodos associados a esse padrão, mas foi um pouco difícil descobri-los exatamente. Vou postar aqui o que acho que está acontecendo e ver se a comunidade confirma ou desconfirma minhas suspeitas.
Cenário 1: Mudança de nenhum pai para um novo controlador de visualização pai
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
As duas primeiras linhas devem ocorrer na ordem indicada ou podem ser invertidas?
Cenário 2: Mover de um controlador de visão pai para nenhum controlador de visão pai
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Também é necessário ligar [vc didMoveToParentViewController:nil]
? Os exemplos na Sessão 102 não fizeram isso neste cenário, mas não sei se isso foi uma omissão ou não.
Cenário 3: Movendo de um controlador de visão pai para outro
Isso provavelmente ocorrerá da seguinte maneira, porque a lógica em cada controlador de visualização pai será encapsulada.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Questões
Minha principal pergunta é: É assim que a contenção do controlador de visualizações deve funcionar, em geral? A mecânica fornecida acima está correta?
É necessário ligar willMoveToParentViewController
antes de ligar addChildViewController
? Esta parece ser a ordem lógica para mim, mas é estritamente necessária?
É necessário ligar didMoveToParentViewController:nil
depois de ligar removeFromParentViewController
?
addChildViewController
deve ser equilibrado comdidMoveToParentViewController
ewillMoveToParentViewController
deve ser equilibrado comremoveFromParentViewController
. Isso é exatamente o que eu estava procurando. Não tenho certeza de como eu perdi isso nos documentos.