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.

9voto

dieselmcfadden Punkte 203

Sie können es hier sehen.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if (viewController == YourAboutToAppearController) {
            // do something
    }
}

Dieser wird kurz vor der Anzeige der neuen Ansicht ausgelöst. Niemand hat sich bisher bewegt. Ich verwende die ganze Zeit, um vor dem dämlichen NavigationController zu zaubern. Sie können Titel und Schaltflächentitel setzen und was auch immer dort tun.

3voto

hiepnd Punkte 821

Ich habe das gleiche Problem. Ich habe versucht, mit viewDisDisappear, aber ich habe nicht die Funktion aufgerufen :( (weiß nicht, warum, vielleicht weil alle meine VC ist UITableViewController). Der Vorschlag von Alex funktioniert gut, aber er schlägt fehl, wenn Ihr Navigationscontroller unter der Registerkarte More angezeigt wird. In diesem Fall haben alle VCs deiner Navigationscontroller den navigationController als UIMoreNavigationController, nicht den Navigationscontroller, den du subclassed hast, so dass du nicht von der nav benachrichtigt wirst, wenn ein VC im Begriff ist zu poppen.
Finaly, löste ich das Problem mit einer Kategorie von UINavigationController, einfach umschreiben - (UIViewController *)popViewControllerAnimated:(BOOL)animated

- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
   NSLog(@"UINavigationController(Magic)");
   UIViewController *vc = self.topViewController;
   if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) {
      [vc performSelector:@selector(viewControllerWillBePopped)];
   }
   NSArray *vcs = self.viewControllers;
   UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2];
   [self popToViewController:vcc animated:YES];
   return vcc;}

Das funktioniert bei mir gut :D

2voto

Oded Ben Dov Punkte 9215

Ich habe dies versucht:

- (void) viewWillDisappear:(BOOL)animated {
    // If we are disappearing because we were removed from navigation stack
    if (self.navigationController == nil) {
        // YOUR CODE HERE
    }

    [super viewWillDisappear:animated];
}

Die Idee ist, dass der navigationController des View-Controllers beim Start auf Null gesetzt wird. Also, wenn die Ansicht zu verschwinden war, und es hat mehr ein navigationController, schloss ich es gepoppt wurde. (könnte in anderen Szenarien nicht funktionieren).

Ich kann mich nicht dafür verbürgen, dass viewWillDisappear beim Popping aufgerufen wird, da es in der Dokumentation nicht erwähnt wird. Ich habe es versucht, wenn die Ansicht war oben Ansicht, und unter oben Ansicht - und es funktionierte in beiden.

Viel Glück! Oded.

2voto

Orkhan Alikhanov Punkte 7491

Unterklasse UINavigationController und außer Kraft setzen popViewController :

Mauersegler 3

protocol CanPreventPopProtocol {
    func shouldBePopped() -> Bool
}

class MyNavigationController: UINavigationController {
    override func popViewController(animated: Bool) -> UIViewController? {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return nil
            }
        }
        return super.popViewController(animated: animated)
    }

    //important to prevent UI thread from freezing
    //
    //if popViewController is called by gesture recognizer and prevented by returning nil
    //UI will freeze after calling super.popViewController
    //so that, in order to solve the problem we should not return nil from popViewController
    //we interrupt the call made by gesture recognizer to popViewController through
    //returning false on gestureRecognizerShouldBegin
    //
    //tested on iOS 9.3.2 not others
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return false
            }
        }

        return true
    }

}

1voto

itechnician Punkte 1649

Sie können diese verwenden:

if(self.isMovingToParentViewController)
{
    NSLog(@"Pushed");
}
else
{
    NSLog(@"Popped");
}

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