Frage

Ich muss wissen, wenn meine Ansicht-Controller über ist von einem nav Stapel genommen werden, so kann ich eine Aktion ausführen.

Ich kann nicht -viewWillDisappear verwenden, denn das aufgerufen wird, wenn die View-Controller-Bildschirm für irgendeinen Grund weg bewegt wird (wie ein neuer View-Controller oben geschoben wird).

Ich muss speziell wissen, wenn die Steuerung über selbst geknallt werden.

Irgendwelche Ideen wären genial, danke im voraus.

War es hilfreich?

Lösung

Ich glaube nicht, dass es eine explizite Nachricht hierfür ist, aber man konnte die UINavigationController Unterklasse und überschreiben -. PopViewControllerAnimated (obwohl ich das vor mir nicht versucht haben)

Alternativ, wenn es keine weiteren Hinweise auf die View-Controller sind, können Sie in dem seine - dealloc

Andere Tipps

Überschreiben Sie die viewWillDisappear Methode in der VC vorgestellt, dann die in der Überschreibung isMovingFromParentViewController Flag überprüfen und spezifische Logik tun. In meinem Fall bin ich versteckt die Navigation-Controller-Symbolleiste. Dennoch erfordert, dass Ihr präsentiert VC verstehen, dass es aber so nicht perfekt geschoben wurde.

Versuchen Sie willMoveToParentViewController: (statt viewWillDisappear:) in Ihrer benutzerdefinierten Unterklasse von UIViewController.

  

Wird aufgerufen, kurz bevor die View-Controller aus einem Container-View-Controller hinzugefügt oder entfernt werden.

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

Zum Glück, durch die Zeit, die viewWillDisappear Methode aufgerufen wird, hat die Viewcontroller bereits aus dem Stapel entfernt worden ist, so dass wir, die Viewcontroller knallen, weil es nicht mehr ist in den self.navigationController.viewControllers

Swift 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
    }
}

Original-Code

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

Dies funktioniert für mich.

- (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");
    }
}

Sie können es hier fangen.

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

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

Das Feuer wird kurz vor der Anzeige der neuen Ansicht. Niemand hat noch bewegt. Ich benutze die ganze Zeit Magie vor dem asinine Navigation zu tun. Sie können Titel und Schaltfläche Titel und tun, was dort eingestellt.

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 es schlägt fehl, wenn Ihr Navigationscontroller unter der Registerkarte Weitere angezeigt wird. In diesem Fall werden alle VCs Ihrer nav-Controller haben die Navigation als UIMoreNavigationController, nicht dem Navigationscontroller Sie subclassed haben, so dass Sie nicht durch die nav benachrichtigt werden, wenn ein VC geknallt ist etwa.
Finaly, löste ich das Problem mit einer Kategorie von UINavigationController, nur umschreiben - (UIViewController *) popViewControllerAnimated: (BOOL) animiert

- (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;}

Es funktioniert gut für mich: D

Ich habe versucht, dies:

- (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 bei Knallen, die Navigation Ansicht Controller auf Null gesetzt ist. Wenn also die Ansicht verschwinden sollte, und es hat mehr Navigation, schloss ich es geknallt wurde. (Möglicherweise nicht in anderen Szenarien funktioniert).

Kann nicht bürgen, dass viewWillDisappear auf popping genannt werden, da sie nicht in der Dokumentation erwähnt wird. Ich versuchte es, wenn die Aussicht war Draufsicht und unten Ansicht von oben -. Und es funktionierte in beide

Viel Glück, Oded.

Sie können dieses verwenden:

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

Subclass UINavigationController und Überschreibung popViewController:

Swift 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
    }

}
shouldPopItem Protokollverfahren

Vielleicht könnten Sie UINavigationBarDelegate die navigationbar verwenden.

Versuchen Sie, diese Überprüfung in viewwilldisappear machen if ([self.navigationController.viewControllers IndexOfObject: self] == NSNotFound) { // popping dieser Ansicht hat passiert. }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top