Enquanto viewWillAppear()
e viewDidDisappear()
são chamados quando o botão Voltar é pressionado, eles também são chamados em outros momentos. Veja o final da resposta para mais informações.
Usando UIViewController.parent
A detecção do botão Voltar é melhor quando o VC é removido do pai (o NavigationController) com a ajuda de willMoveToParentViewController(_:)
OUdidMoveToParentViewController()
Se o pai for nulo, o controlador de exibição está sendo retirado da pilha de navegação e descartado. Se o pai não for nulo, ele será adicionado à pilha e apresentado.
// Objective-C
-(void)willMoveToParentViewController:(UIViewController *)parent {
[super willMoveToParentViewController:parent];
if (!parent){
// The back button was pressed or interactive gesture used
}
}
// Swift
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil {
// The back button was pressed or interactive gesture used
}
}
Trocar willMove
para didMove
e verificação self.parent para fazer o trabalho após o controlador de vista é indeferido.
Parando a dispensa
Observe que verificar o pai não permite "pausar" a transição se você precisar fazer algum tipo de salvamento assíncrono. Para fazer isso, você pode implementar o seguinte. A única desvantagem aqui é que você perde o elegante botão de estilo / animação do iOS. Também tenha cuidado aqui com o gesto de furto interativo. Use o seguinte para lidar com este caso.
var backButton : UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
// Disable the swipe to make sure you get your chance to save
self.navigationController?.interactivePopGestureRecognizer.enabled = false
// Replace the default back button
self.navigationItem.setHidesBackButton(true, animated: false)
self.backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
self.navigationItem.leftBarButtonItem = backButton
}
// Then handle the button selection
func goBack() {
// Here we just remove the back button, you could also disabled it or better yet show an activityIndicator
self.navigationItem.leftBarButtonItem = nil
someData.saveInBackground { (success, error) -> Void in
if success {
self.navigationController?.popViewControllerAnimated(true)
// Don't forget to re-enable the interactive gesture
self.navigationController?.interactivePopGestureRecognizer.enabled = true
}
else {
self.navigationItem.leftBarButtonItem = self.backButton
// Handle the error
}
}
}
Mais informações aparecerão / apareceram
Se você não conseguiu o viewWillAppear
viewDidDisappear
problema, vamos dar um exemplo. Digamos que você tenha três controladores de exibição:
- ListVC: Uma exibição de tabela das coisas
- DetailVC: detalhes sobre uma coisa
- SettingsVC: algumas opções para uma coisa
Vamos seguir os exorta a detailVC
que você vá do listVC
para settingsVC
e de volta paralistVC
Lista> Detalhe (push detailVC) Detail.viewDidAppear
<- aparece
Detail> Settings (push settingsVC) Detail.viewDidDisappear
<- desaparece
E à medida que voltamos ...
Configurações> Detalhe (pop settingsVC) Detail.viewDidAppear
<- aparece
Detalhes> List (pop detailVC) Detail.viewDidDisappear
<- desaparece
Observe que isso viewDidDisappear
é chamado várias vezes, não apenas ao voltar, mas também ao avançar. Para uma operação rápida que pode ser desejada, mas para uma operação mais complexa como uma chamada de rede para salvar, talvez não.