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?
Versuchen Sie folgenden Code:
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: ViewController) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}
Für Swift 3
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
if aViewController is YourViewController {
self.navigationController!.popToViewController(aViewController, animated: true)
}
}
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.
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)
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)
}
}
}
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)
}
}
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)
}
}
}
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)
}
}
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)
}
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
}
}
}
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)
}
}
Swift 4
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: HomeViewController.self) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}