Estou prestes a criar um aplicativo usando um UINavigationController
para apresentar os próximos controladores de visualização. Com o iOS5, há um novo método de apresentação UIViewControllers
:
presentViewController:animated:completion:
Agora me pergunto por que não existe um manipulador de conclusão para UINavigationController
? Há apenas
pushViewController:animated:
É possível criar meu próprio manipulador de conclusão como o novo presentViewController:animated:completion:
?
viewDidAppear:animated:
permite que você execute o código cada vez que seu controlador de visualização aparecer na tela (viewDidLoad
apenas a primeira vez que seu controlador de visualização é carregado)-(void)viewDidAppear:(BOOL)animated
Respostas:
Veja a resposta da par para outra solução mais atualizada
UINavigationController
animações são executadas comCoreAnimation
, portanto, faria sentido encapsular o código dentroCATransaction
e, assim, definir um bloco de conclusão.Swift :
Para o rápido, sugiro criar uma extensão como tal
Uso:
Objective-C
Cabeçalho:
Implementação:
fonte
pushViewController:animated:
oupopViewController:animated
, as chamadasviewDidLoad
eviewDidAppear
acontecem em ciclos de execução subsequentes. Portanto, minha impressão é que mesmo que esses métodos invoquem animações, eles não farão parte da transação fornecida no exemplo de código. Era essa a sua preocupação? Porque essa solução é incrivelmente simples.didShowViewController
. Embora esta solução seja fantasticamente simples, eu questionaria sua "compatibilidade com o futuro". Especialmente devido às mudanças para visualizar os retornos de chamada do ciclo de vida que vieram com ios7 / 8iOS 7+ Swift
Swift 4:
EDIT: Eu adicionei uma versão Swift 3 da minha resposta original. Nesta versão, removi o exemplo de co-animação mostrado na versão Swift 2, pois parece ter confundido muitas pessoas.
Swift 3:
Swift 2:
fonte
nil
como bloco de animação.nil
é uma coisa perfeitamente válida.transitionCoordinator
for nulo?transitionCoordinator
vir um , é provável que esteja chamando essa função muito cedo no ciclo de vida do controlador de navegação. Espere pelo menos atéviewWillAppear()
ser chamado antes de tentar empurrar um controlador de visualização com animação.Com base na resposta do par (que era a única que funcionava com iOS9), mas mais simples e com um else ausente (o que poderia fazer com que a conclusão nunca fosse chamada):
fonte
Atualmente, o
UINavigationController
não suporta isso. Mas há oUINavigationControllerDelegate
que você pode usar.Uma maneira fácil de fazer isso é subclassificar
UINavigationController
e adicionar uma propriedade de bloco de conclusão:Antes de enviar o novo controlador de visualização, você teria que definir o bloco de conclusão:
Esta nova subclasse pode ser atribuída no Interface Builder ou ser usada programaticamente desta forma:
fonte
pushViewController:animated:completion:
, tornaria isso uma solução elegante.Aqui está a versão do Swift 4 com o Pop.
Apenas no caso de alguém precisar disso.
fonte
Para expandir a resposta de @Klaas (e como resultado desta pergunta), adicionei blocos de conclusão diretamente ao método push:
Para ser usado da seguinte forma:
fonte
if... (self.pushedVC == viewController) {
está incorreto. Você precisa testar a igualdade entre os objetos usandoisEqual:
, ou seja,[self.pushedVC isEqual:viewController]
isEqual
provavelmente seria mais tecnicamente correto caso eles já fizessem.Desde iOS 7.0, você pode usar
UIViewControllerTransitionCoordinator
para adicionar um bloco de conclusão push:fonte
Swift 2.0
fonte
É necessário um pouco mais de tubulação para adicionar esse comportamento e manter a capacidade de definir um delegado externo.
Esta é uma implementação documentada que mantém a funcionalidade de delegado:
LBXCompletingNavigationController
fonte