Estou lutando para encontrar uma boa solução para esse problema. No -viewWillDisappear:
método de um controlador de exibição , preciso encontrar uma maneira de determinar se é porque um controlador de exibição está sendo empurrado para a pilha do controlador de navegação ou se é porque o controlador de exibição está desaparecendo porque foi acionado.
No momento, estou definindo sinalizadores como, isShowingChildViewController
mas está ficando bastante complicado. A única maneira que acho que posso detectá-lo é no -dealloc
método.
fonte
viewWillAppear
parece que, se o controlador de exibição está sendo revelado por ser pressionado ou se algo acima está sendo acionado, o array viewControllers é o mesmo nos dois sentidos! Alguma ideia?viewDidLoad
, pois é chamado apenas uma vez! Hmm, complicado!![viewControllers containsObject:self]
, em vez de[viewControllers indexOfObject:self] == NSNotFound
? Escolha de estilo?-isMovingFromParentViewController
método mencionado abaixo permite testar se a exibição está sendo exibida explicitamente.Eu acho que a maneira mais fácil é:
Rápido:
fonte
Da documentação da Apple em UIViewController.h:
Então, sim, a única maneira documentada de fazer isso é a seguinte:
Versão Swift 3:
fonte
Se você quer apenas saber se sua visualização está sendo exibida, eu acabei de descobrir que
self.navigationController
estánil
dentroviewDidDisappear
, quando é removida da pilha de controladores. Portanto, esse é um teste alternativo simples.(Descobri isso depois de tentar todos os tipos de outras contorções. Estou surpreso que não exista um protocolo de controlador de navegação para registrar um controlador de exibição para ser notificado em pops. Você não pode usá-lo
UINavigationControllerDelegate
porque isso realmente funciona de verdade.)fonte
Swift 4
fonte
Em Swift:
fonte
Acho que a documentação da Apple sobre isso é difícil de entender. Esta extensão ajuda a ver os estados em cada navegação.
fonte
Esta pergunta é bastante antiga, mas eu a vi por acidente, por isso quero postar as melhores práticas (afaik)
você pode apenas fazer
fonte
Isso se aplica ao iOS7 , não faz ideia se se aplica a outros. Pelo que sei, na
viewDidDisappear
visão já foi exibida. O que significa que quando você consulta,self.navigationController.viewControllers
você obtém umnil
. Então basta verificar se isso é nulo.TL; DR
fonte
Os segmentos podem ser uma maneira muito eficaz de lidar com esse problema no iOS 6+. Se você forneceu um identificador a um determinado seguidor no Interface Builder, é possível fazer o check-in
prepareForSegue
.fonte
Obrigado @Bryan Henry, ainda trabalha em Swift 5
fonte
Suponho que você queira dizer que sua visualização está sendo movida para baixo na pilha do controlador de navegação, pressionando uma nova visualização quando você diz empurrado para a pilha. Sugiro usar o
viewDidUnload
método para adicionar umaNSLog
declaração para escrever algo para o console para que você possa ver o que está acontecendo, você pode querer adicionar umNSLog
paraviewWillDissappeer
.fonte
Aqui está uma categoria para realizar o mesmo que a resposta do sbrocket:
Cabeçalho:
Fonte:
fonte