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.

1voto

Simon Moshenko Punkte 1802

Ich musste auch verhindern, dass es manchmal knallt, also war die beste Antwort für mich von Orkhan Alikhanov geschrieben. Aber es hat nicht funktioniert, weil der Delegierte nicht festgelegt war, so dass ich die endgültige Version gemacht:

import UIKit

class CustomActionsNavigationController: UINavigationController, 
                                         UIGestureRecognizerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    override func popViewController(animated: Bool) -> UIViewController? {
        if let delegate = topViewController as? CustomActionsNavigationControllerDelegate {
            guard delegate.shouldPop() else { 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
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if let delegate = topViewController as? CustomActionsNavigationControllerDelegate {
            if !delegate.shouldPop() {
                return false
            }
        }

        // This if statement prevents navigation controller to pop when there is only one view controller
        if viewControllers.count == 1 {
            return false
        }

        return true
    }
}

protocol CustomActionsNavigationControllerDelegate {
    func shouldPop() -> Bool
}

UPDATE

Ich habe hinzugefügt viewControllers.count == 1 Fall, denn wenn es nur einen Controller im Stapel gibt und der Benutzer die Geste ausführt, wird die Benutzeroberfläche Ihrer Anwendung eingefroren.

1voto

malhal Punkte 19978

Sie können die Benachrichtigung beobachten:

- (void)viewDidLoad{
    [super viewDidLoad];
    [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(navigationControllerWillShowViewController:) name:@"UINavigationControllerWillShowViewControllerNotification" object:nil];
}

- (void)navigationControllerDidShowViewController:(NSNotification *)notification{
    UIViewController *lastVisible = notification.userInfo[@"UINavigationControllerLastVisibleViewController"];
    if(lastVisible == self){
        // we are being popped
    }
}

1voto

Aleksey Mazurenko Punkte 565
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    const BOOL removingFromParent = ![self.navigationController.viewControllers containsObject:self.parentViewController];
    if ( removingFromParent ) {
        // cleanup
    }
}

0voto

François P. Punkte 5166

Vielleicht könnten Sie die UINavigationBarDelegate's navigationBar:shouldPopItem Protokollmethode verwenden.

0voto

ravoorinandan Punkte 773

Versuchen Sie, diese Prüfung in viewwilldisappear durchzuführen if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) { //das Popping dieser Ansicht hat stattgefunden. }

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