Mentre viewWillAppear()
e viewDidDisappear()
vengono chiamati quando si tocca il pulsante Indietro, vengono anche chiamati altre volte. Vedi fine della risposta per ulteriori informazioni al riguardo.
Utilizzando UIViewController.parent
È meglio rilevare il pulsante Indietro quando il VC viene rimosso dal suo genitore (NavigationController) con l'aiuto di willMoveToParentViewController(_:)
ORdidMoveToParentViewController()
Se parent è zero, il controller di visualizzazione viene rimosso dallo stack di navigazione e eliminato. Se parent non è zero, viene aggiunto allo stack e presentato.
// 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
}
}
Swap fuori willMove
per didMove
e controllo self.parent per fare il lavoro dopo il controller della vista è respinto.
Fermare il licenziamento
Nota: il controllo del genitore non ti consente di "mettere in pausa" la transizione se devi eseguire una sorta di salvataggio asincrono. Per fare ciò è possibile implementare quanto segue. L'unico aspetto negativo qui è che si perde il pulsante posteriore in stile iOS animato / animato. Fai anche attenzione qui con il gesto di scorrimento interattivo. Utilizzare quanto segue per gestire questo 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
}
}
}
Ulteriori informazioni verranno visualizzate / visualizzate
Se non hai riscontrato il viewWillAppear
viewDidDisappear
problema, analizziamo un esempio. Supponiamo che tu abbia tre controller di visualizzazione:
- ListVC: una vista tabella delle cose
- DetailVC: Dettagli su una cosa
- SettingsVC: alcune opzioni per una cosa
Consente di seguire le chiamate detailVC
mentre si procede dal listVC
al settingsVC
e viceversalistVC
Elenco> Dettagli (push detailVC) Detail.viewDidAppear
<- compare
Dettagli> Impostazioni (push settingsVC) Detail.viewDidDisappear
<- scompare
E mentre torniamo indietro ...
Impostazioni> Dettagli (pop settingsVC) Detail.viewDidAppear
<- Appare
Dettagli> Elenco (pop detailVC) Detail.viewDidDisappear
<- scomparire
Si noti che viewDidDisappear
viene chiamato più volte, non solo quando si torna indietro, ma anche quando si va avanti. Per un'operazione rapida che può essere desiderata, ma per un'operazione più complessa come una chiamata di rete da salvare, potrebbe non esserlo.