Frage

Ich bin mit Navigation-basierter Anwendung. Ich schiebe Erste Viewcontroller zu Second Viewcontroller und von Second Viewcontroller zu Third Viewcontroller. Jetzt möchte ich von Third Viewcontroller First ViewController.I Pop bin der Durchführung dieser Aufgabe unter Verwendung der folgenden Code, aber meine Anwendung abgestürzt ist.

Bitte jede Stelle geben Sie mir einige richtige Richtlinien. Ich kann nicht auf RootViewController Pop verwenden, weil es anders ist Viewcontroller. Vielen Dank im Voraus ...

In Third ViewControler Ich habe dies geschrieben:

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
War es hilfreich?

Lösung

Die erste Zeile durch das Schreiben erhalten Sie die Indizes aller View-Controller und von der zweiten Linie wird Sie an Ihr Ziel erreichen werden.

NSArray *array = [self.navigationController viewControllers];

[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];

Andere Tipps

Ein sicherer Ansatz:

- (void)turnBackToAnOldViewController{

    for (UIViewController *controller in self.navigationController.viewControllers) {

        //Do not forget to import AnOldViewController.h
        if ([controller isKindOfClass:[AnOldViewController class]]) { 

            [self.navigationController popToViewController:controller
                                                  animated:YES];
            return;
        }
    }
}

Swifty Art und Weise:

     let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
     navigationController!.popToViewController(dashboardVC, animated: true)
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

Oft ist es wichtiger, dass der Stapel von oben zu tun, also:

- (void)popToLast:(Class)aClass
{
    for (int i=self.navigationController.viewControllers.count-1; i>=0; i--)
    {
        UIViewController *vc = self.navigationController.viewControllers[i];
        if ([vc isKindOfClass:aClass])
        {
            [self.navigationController popToViewController:vc animated:YES];
            break;
        }
    }
}

und das nennst du

popToLast:[SomeViewController class];
- (void) RetunToSpecificViewController{

   for (UIViewController *controller in self.navigationController.viewControllers)
    {
           if ([controller isKindOfClass:[AnOldViewController class]])
           {
            //Do not forget to import AnOldViewController.h

                       [self.navigationController popToViewController:controller
                                                             animated:YES];
                        break;
            }
    }
}

Schnelle und sichere Swift 3 Version:

if let vc = navigationController.viewControllers.filter({ $0 is SpecificViewControllerClass }).first {
  navigationController.popToViewController(vc, animated: true)
}

Ihr Code eine neue Instanz einer Ansicht erstellt, die auf den Stapel geschoben nie wurde, dann versucht, diesen Controller Pop zurück.

Wenn Sie zurück in die Wurzel-View-Controller tauchen, können Sie Anwendungen popToRootViewControllerAnimated:

Wenn Sie eine bekannte Strecke tauchen wieder können Sie popViewControllerAnimated: mehr als einmal aufrufen. In Ihrem Beispiel wäre, dass 2-Controller sein, so zu telefonieren. Sie könnten 2 vom Ende für den Controller, indem Sie in viewControllers das gleiche tun und knallen zu.

Die oben genannten Vorschläge sind schnelle Lösungen. Ein Best-Practice-Szenario wäre, um den Controller zu übergeben Sie zurückkehren wollen zusammen zu jedem aufeinanderfolgenden Controller Sie drücken. Zuerst leitet mich zweite, geht Sekunde, den Bezug auf dem dritten, dritten Pop zu der übergebenen Referenz, die ersten ist.

In der Tat, erstellen Sie einen temporären Root-Controller. Sie könnten UINavigationController Unterklasse und eine temporaryRoot Eigenschaft und eine popToTemporaryRootViewControllerAnimated: Methode hinzuzufügen, die Ihre temporären Wurzel Pop würde, und deaktivieren Sie es. Wenn er zum ersten Schub Sekunden sei es auch selbst als temporäre Wurzel gesetzt, so dass jede Steuereinheit in dem Stapel muss nicht um ein Referenzgeben. Sie würden zusätzliche Kontrollen hinzufügen müssen Sie nie über die temporaryRoot Pop unsicher, ohne sie zu löschen.

Nach viel Mühe hat jemand in Swift 3.0 Erweiterung der zurück zu einem bestimmten View-Controller swift erstellt.

extension UINavigationController {

    func backToViewController(viewController: Swift.AnyClass) {

            for element in viewControllers as Array {
                if element.isKind(of: viewController) {
                    self.popToViewController(element, animated: true)
                break
            }
        }
    }
}

Aufruf der Methode:

 self.navigationController?.backToViewController(viewController: YourViewController.self)

Implementiert & Getestet in Swift 3.0

Im Folgenden finden Sie die Methode kann nützlich für die Navigation zu einem bestimmten View-Controller:

func poptoSpecificVC(viewController : Swift.AnyClass){
        let viewControllers: [UIViewController] = self.navigationController!.viewControllers
        for aViewController in viewControllers {
            if aViewController.isKind(of: viewController) {
                self.navigationController!.popToViewController(aViewController, animated: true)
                break;
            }
        }
    }

Verwendung:

self.poptoSpecificVC(viewController: createIntervalVC.self)

ich denke, dass .filter({...}).first ist ein wenig langsamer als .first(where: {...}). Auch könnte dies genau geschrieben mehr werden, um Adresse nur UIViewControllers.

extension UINavigationController {
    func popToController<T: UIViewController>(_ type: T.Type, animated: Bool) {
        if let vc = viewControllers.first(where: { $0 is T }) {
            popToViewController(vc, animated: animated)
        }
    }
    func popToControllerOrToRootControllerIfNotInTheStack<T: UIViewController>(_ type: T.Type, animated: Bool) {
        if let vc = viewControllers.first(where: { $0 is T }) {
            popToViewController(vc, animated: animated)
        } else {
            popToRootViewController(animated: animated)
        }
    }
}
  

Aktualisiert für Swift 3:

unter einfachen Code verwendet, für Pop zu bestimmten View-Controller;

 for vc in self.navigationController!.viewControllers as Array {
          if vc.isKind(of: YourViewControllerName) {
               self.navigationController!.popToViewController(vc, animated: true)
               break
          }
    }

Swift 4 Version

if let viewController = navigationController?.viewControllers.first(where: {$0 is YourViewController}) {
      navigationController?.popToViewController(viewController, animated: false)
}

Sie eine anderen Filter auf .viewControllers.first nach Ihrem Bedarf angeben können beispiels können sagen, wenn Sie glichen kind Sicht Controller haben in dem Navigationscontroller mit Wohnsitz dann können Sie eine zusätzliche Prüfung wie unter

angeben
  if let viewController = navigationController?.viewControllers.first(where: {
        if let current = $0 as? YourViewController {
             return current.someProperty == "SOME VALUE"
        }
       return false } ) {
            navigationController?.popToViewController(viewController, animated: false)
   }
for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: LoginVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

Setzen Funktion in UIViewController 1. es wird geprüft, ob spezifische UIViewController In UINavigationController existiert dann popToViewController oder auch pushViewController

func navigate(_ navVC: AnyClass, pushVC: UIViewController) {
    for obj in self.navigationController!.viewControllers {
        if obj.isMember(of: navVC) {
            self.navigationController!.popToViewController(obj, animated: true)
            return
        }
    }
    self.navigationController!.pushViewController(pushVC, animated: true)
}

Mit

self.navigate(ViewController.self, pushVC: self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController)

ich habe hier Antwort. Das ist 100% Arbeits Code für Swift> 4.X

Wie kann ich bestimmte View-Controller-Pop in Swift

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