Podczas gdy viewWillAppear()
i viewDidDisappear()
są wywoływane po dotknięciu przycisku Wstecz, są również wywoływane w innych przypadkach. Zobacz koniec odpowiedzi, aby uzyskać więcej informacji na ten temat.
Korzystanie z UIViewController.parent
Wykrywanie przycisku wstecz jest lepsze, gdy VC jest usuwany z jego elementu nadrzędnego (NavigationController) za pomocą willMoveToParentViewController(_:)
LUBdidMoveToParentViewController()
Jeśli rodzic ma wartość zero, kontroler widoku jest zdejmowany ze stosu nawigacji i odrzucany. Jeśli rodzic nie jest nil, jest dodawany do stosu i prezentowany.
// 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
}
}
Zamień się willMove
na didMove
i check self.parent do pracy po kontroler widoku zostaje odrzucona.
Zatrzymanie zwolnienia
Zwróć uwagę, że sprawdzenie rodzica nie pozwala na „wstrzymanie” przejścia, jeśli musisz wykonać jakiś rodzaj asynchronicznego zapisu. Aby to zrobić, możesz zaimplementować następujące. Jedynym minusem jest to, że tracisz fantazyjny / animowany przycisk Wstecz w stylu iOS. Uważaj również tutaj na interaktywny gest machnięcia. Użyj poniższych, aby obsłużyć ten przypadek.
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
}
}
}
Więcej na widoku pojawi się / pojawiło się
Jeśli nie masz viewWillAppear
viewDidDisappear
problemu, przeanalizujmy przykład. Załóżmy, że masz trzy kontrolery widoku:
- ListVC: Widok tabeli rzeczy
- DetailVC: Szczegóły dotyczące rzeczy
- SettingsVC: Niektóre opcje
Pozwala śledzić połączenia w detailVC
miarę przechodzenia od listVC
do settingsVC
iz powrotemlistVC
Lista> Szczegóły (push szczegółyVC) Detail.viewDidAppear
<- wyświetl
Szczegóły> Ustawienia (ustawienia pushVC ) Detail.viewDidDisappear
<- znikają
A jak wrócimy ...
Ustawienia> Szczegóły (wyskakują ustawieniaVC) Detail.viewDidAppear
<- pojawiają się
szczegóły> Lista (pojawiają się szczegółyVC) Detail.viewDidDisappear
<- znikają
Zauważ, że viewDidDisappear
jest to wywoływane wiele razy, nie tylko podczas cofania, ale także podczas jazdy do przodu. Dla szybkiej operacji, która może być pożądana, ale dla bardziej złożonej operacji, takiej jak połączenie sieciowe w celu zapisania, może nie być.