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
?
fonte
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.Esta parte não está correta:
De acordo com a documentação:
Então você não precisa da
[vc willMoveToParentViewController:self]
ligação. Isso é feito automaticamente quando você liga[self addChildViewController:vc]
. Aqui está o exemplo de código novamente:Para remover controladores de visualização:
Presumivelmente, esta chamada é
[oldVC didMoveToParentViewController:nil]
.fonte
didMoveToParentViewController
" imediatamente após chamar o método addChildViewController:", mas não especifica quando você realmente adiciona a subvisualização filha. Eu me pergunto se todos entenderam isso errado. Existe um exemplo em alguns Apple Docs que podemos comparar com isso?willMoveToParentViewController
antesaddChildViewController
se o item que você está em movimento é uma classe personalizada com substituídoaddChildViewController
(a menos que seu substituir o chama internamente)