webentwicklung-frage-antwort-db.com.de

Wie kann ich einen bestimmten View Controller in Swift öffnen?

Ich habe den Objective-C-Code unten verwendet, um ein bestimmtes ViewController zu öffnen.

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

Wie kann ich das in Swift machen?

15
Mahesh Cheliya

Versuchen Sie folgenden Code:

for controller in self.navigationController!.viewControllers as Array {
    if controller.isKind(of: ViewController) {
        self.navigationController!.popToViewController(controller, animated: true)
        break
    }
}
59
Mohit

Für Swift 3  

let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
    if aViewController is YourViewController {
        self.navigationController!.popToViewController(aViewController, animated: true)
    }
}
27

Swift 4.0

for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: DashboardVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

Das funktioniert perfekt.

14
Ashu

Ich bevorzuge eine generische Methode.

Ich habe diese Erweiterung für den UINavigationController:

extension UINavigationController {

   func backToViewController(vc: Any) {
      // iterate to find the type of vc
      for element in viewControllers as Array {
         if "\(element.dynamicType).Type" == "\(vc.dynamicType)" {
            self.popToViewController(element, animated: true)
            break
         }
      }
   }

}

Nehmen wir an, ich habe eine FOHomeVC-Klasse (die ein UIViewController ist) im Navigations-Stack instanziiert.

Also würde ich das in meinem Code tun:

self.navigationController?.backToViewController(FOHomeVC.self)
11
PabloR

Swift 5

So rufen Sie die neueste Instanz einer bestimmten Klasse auf, z. B. SomeViewController:

navigationController?.popToViewController(ofClass: SomeViewController.self)

Sie müssen jedoch die Erweiterung UINavigationController hinzufügen:

extension UINavigationController {
  func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
      popToViewController(vc, animated: animated)
    }
  }
}
3
budidino

Suchen Sie Ihren View Controller aus dem Navigationsstapel, und navigieren Sie zu diesem View Controller, falls vorhanden 

for vc in self.navigationController!.viewControllers {
    if let myViewCont = vc as? VCName 
    {
        self.navigationController?.popToViewController(myViewCont, animated: true)
    }
}
3
Chinju James

Ich habe UINavigationController eine Erweiterung hinzugefügt, mit der Sie feststellen können, ob dieser Controller im Navigations-Stack vorhanden ist. Wenn ja, wird es an diesen Controller gesendet, oder Sie übergeben einen neuen Controller mit pushController param an Push. 

extension UINavigationController {

    func containsViewController(ofKind kind: AnyClass) -> Bool {
        return self.viewControllers.contains(where: { $0.isKind(of: kind) })
    }

    func popPushToVC(ofKind kind: AnyClass, pushController: UIViewController) {
        if containsViewController(ofKind: kind) {
            for controller in self.viewControllers {
                if controller.isKind(of: kind) {
                    popToViewController(controller, animated: true)
                    break
                }
            }
        } else {
            pushViewController(pushController, animated: true)
        }
    }
}
3
Parth Adroja

Im neuesten Swift 

   @IBAction func popToConversationsVC(_ sender: UIButton) {
        if (self.navigationController != nil) {
            for vc in  self.navigationController!.viewControllers {
                if vc is ConversationsVC {
                     self.navigationController?.popToViewController(vc, animated: false)
                }
            }
            }
    }

Bitte verwenden Sie den folgenden Code für Swift 3.0:

 let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];

for aViewController:UIViewController in viewControllers {
            if aViewController.isKind(of: YourViewController.self) {
                _ = self.navigationController?.popToViewController(aViewController, animated: true)
            }
        }
1
urvashi bhagat

einfache und beste Lösung ohne Kraft ausgepackt ist

if let vc = navigationController.viewControllers.filter({$0 is YourViewController}).first as? YourViewController {
            self.navigationController.popToViewController(vc, animated: true)
            }
0
Ali Subhani

Ich musste das benutzen, weil in einigen Fällen die App abstürzt:

if let navVC = self.navigationController {
                    let views = navVC.viewControllers as Array
                    for controller in views {
                        if controller.isKind(of: YourVC.self) {
                            navVC.popToViewController(controller, animated: true)
                            return
                        }
                    }
                }
0
clopex
extension UINavigationController {
    func popBack(to vc: AnyClass, animated: Bool = true) {
        guard let elementFound = (viewControllers.filter { $0.isKind(of: vc) }).first else {
            fatalError("cannot pop back to \(vc) as it is not in the view hierarchy")
        }
        self.popToViewController(elementFound, animated: animated)
    }
}
0
user2866811

Swift 4  

 for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: HomeViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }
0
Pranit