67 Stimmen

Prüfen, ob ein UIViewController im Begriff ist, aus einem Navigationsstapel gepoppt zu werden?

Ich muss wissen, wenn meine Ansicht-Controller ist im Begriff, von einem Nav-Stack gepoppt, so dass ich eine Aktion ausführen können.

Ich kann nicht verwenden -viewWillDisappear, weil das aufgerufen wird, wenn der Viewcontroller aus irgendeinem Grund vom Bildschirm verschoben wird (wie ein neuer Viewcontroller oben geschoben wird).

Ich muss vor allem wissen, wann der Controller sich selbst auflöst.

Jede Idee wäre großartig, danke im Voraus.

92voto

Jeff Marino Punkte 1106

Überschreiben Sie die viewWillDisappear Methode in der vorgestellten VC, dann prüfen Sie die isMovingFromParentViewController Flagge innerhalb der Überschreibung und führen spezifische Logik. In meinem Fall blende ich die Symbolleiste des Navigationscontrollers aus. Immer noch erfordert, dass Ihre präsentierte VC verstehen, dass es aber so nicht perfekt geschoben wurde.

33voto

caoimghgin Punkte 609

Glücklicherweise wurde der viewController zu dem Zeitpunkt, an dem die viewWillDisappear-Methode aufgerufen wird, bereits aus dem Stapel entfernt, so dass wir wissen, dass der viewController verschwindet, weil er sich nicht mehr in der self.navigationController.viewController

Mauersegler 4

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let nav = self.navigationController {
        let isPopping = !nav.viewControllers.contains(self)
        if isPopping {
            // popping off nav
        } else {
            // on nav, not popping off (pushing past, being presented over, etc.)
        }
    } else {
        // not on nav at all
    }
}

Ursprünglicher Code

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ((self.navigationController) && 
        (![self.navigationController.viewControllers containsObject:self])) {
        NSLog(@"I've been popped!");
    }
}

30voto

ma11hew28 Punkte 112879

Versuchen Sie zu überschreiben willMoveToParentViewController: (anstelle von viewWillDisappear: ) in Ihrer benutzerdefinierten Unterklasse von UIViewController .

Wird kurz vor dem Hinzufügen oder Entfernen des View-Controllers aus einem Container-View-Controller aufgerufen.

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    [super willMoveToParentViewController:parent];
    if (!parent) {
        // `self` is about to get popped.
    }
}

16voto

Tom Elliott Punkte 1898

Ich glaube nicht, dass es eine explizite Nachricht für diese, aber Sie könnten die UINavigationController Unterklasse und überschreiben - popViewControllerAnimated (obwohl ich nicht versucht haben, dies vor mir).

Alternativ, wenn es keine anderen Verweise auf den View-Controller, könnten Sie hinzufügen, seine - dealloc?

14voto

Ronald Nepsund Punkte 157

Das funktioniert bei mir.

- (void)viewDidDisappear:(BOOL)animated
{
    if (self.parentViewController == nil) {
        NSLog(@"viewDidDisappear doesn't have parent so it's been popped");
        //release stuff here
    } else {
        NSLog(@"PersonViewController view just hidden");
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X