Ich habe 2 separate navigationcontrollers
, eine mit RootViewController
A und die andere mit RootViewController
B.
Ich kann ViewController
C entweder auf den Navigationsstapel von A oder B schieben .
Frage: Wenn ich in ViewController
C bin , wie kann ich herausfinden, ob ich in dem Stapel bin, der zu A oder B gehört?
Antworten:
Sie könnten die Verwendung
UINavigationController
s‘viewControllers
Eigenschaft:https://developer.apple.com/documentation/uikit/uinavigationcontroller
Sie können dies verwenden, um zu testen, ob der Root-View-Controller (der am Array-Index 0) View-Controller A oder B ist.
quelle
var viewControllers: [UIViewController]
viewControllers.last
viewControllers.last
hat aktuelle Ansicht Controller, Um vorherige Ansicht Controller zu erhalten, sollte man verwendenviewControllers[viewControllers.count-2]
Hier ist die Implementierung der akzeptierten Antwort:
- (UIViewController *)backViewController { NSInteger numberOfViewControllers = self.navigationController.viewControllers.count; if (numberOfViewControllers < 2) return nil; else return [self.navigationController.viewControllers objectAtIndex:numberOfViewControllers - 2]; }
quelle
UIViewController
- (UIViewController *)backViewController { NSInteger myIndex = [self.navigationController.viewControllers indexOfObject:self]; if ( myIndex != 0 && myIndex != NSNotFound ) { return [self.navigationController.viewControllers objectAtIndex:myIndex-1]; } else { return nil; } }
quelle
Eine allgemeinere Umsetzung der akzeptierten Antwort:
- (UIViewController *)backViewController { NSArray * stack = self.navigationController.viewControllers; for (int i=stack.count-1; i > 0; --i) if (stack[i] == self) return stack[i-1]; return nil; }
Dies gibt den korrekten "Back View Controller" zurück, unabhängig davon, wo sich die aktuelle Klasse auf dem Navigationsstapel befindet.
quelle
Schnelle Implementierung von tjklemz- Code als Erweiterung:
extension UIViewController { func backViewController() -> UIViewController? { if let stack = self.navigationController?.viewControllers { for(var i=stack.count-1;i>0;--i) { if(stack[i] == self) { return stack[i-1] } } } return nil } }
quelle
Hier ist eine modifizierte Version von Prabhu Beemans Swift-Code, die ihn an die Unterstützung von Swift 3 anpasst:
extension UIViewController { func backViewController() -> UIViewController? { if let stack = self.navigationController?.viewControllers { for i in (1..<stack.count).reverse() { if(stack[i] == self) { return stack[i-1] } } } return nil } }
quelle
Greifen Sie auf das
n-2
Element derviewControllers
Eigenschaft zu, um auf den übergeordneten Ansichtscontroller zuzugreifen.Sobald Sie diese Instanz haben, können Sie ihren Typ überprüfen, indem Sie protokollieren, was aus der
NSStringFromClass()
Funktion herauskommt . Oder Sie können einestatic const
Bezeichnerzeichenfolge in den Controllern A und B und eine Getter-Funktion behalten , die die Zeichenfolge druckt.quelle
Als
UINavigationController
Erweiterung:extension UINavigationController { func previousViewController() -> UIViewController? { guard viewControllers.count > 1 else { return nil } return viewControllers[viewControllers.count - 2] } }
quelle
Schnelle Implementierung von @ tjklemz-Code:
var backViewController : UIViewController? { var stack = self.navigationController!.viewControllers as Array for (var i = stack.count-1 ; i > 0; --i) { if (stack[i] as UIViewController == self) { return stack[i-1] as? UIViewController } } return nil }
quelle
println("backViewController is: \(backViewController.description)")
; Dadurch erhalten Sie eine Beschreibung wie "UINavigationController: 0x7fcea1d286b0", die nicht sehr klar ist, aber zumindest die Identifizierung des Objekts ermöglicht. Wie gesagt, ich bin mir nicht sicher, was Sie genau brauchen ...Verwenden Sie die
navigationController
Methode, um es abzurufen. Siehe Dokumentation auf der Apple-Website .quelle
Weil tote Pferde gerne geschlagen werden :)
- (UIViewController *)previousViewController { NSArray *vcStack = self.navigationController.viewControllers; NSInteger selfIdx = [vcStack indexOfObject:self]; if (vcStack.count < 2 || selfIdx == NSNotFound) { return nil; } return (UIViewController *)[vcStack objectAtIndex:selfIdx - 1]; }
quelle
Eine prägnantere schnelle Umsetzung:
extension UIViewController { var previousViewController: UIViewController? { guard let nav = self.navigationController, let myIdx = nav.viewControllers.index(of: self) else { return nil } return myIdx == 0 ? nil : nav.viewControllers[myIdx-1] } }
quelle
Das Auffinden des vorherigen Ansichtscontrollers ist einfach.
In Ihrem Fall, dh Sie sind in C und Sie brauchen B,
[self.navigationController.viewControllers lastObject]
ist das , was Sie wollen.Für A, da A der Wurzel - View - Controller ist, können Sie einfach ersetzen
lastObject
mitfirstObject
zu erhalten.quelle
Implementierung für Swift 2.2 - Fügen Sie dies in eine
UIViewController
Erweiterung ein. Sicher in dem Sinne, dass es zurückgegeben wird,nil
wenn der Viewcontroller der Rootvc ist oder nicht in einem Navigationscontroller.var previousViewController: UIViewController? { guard let viewControllers = navigationController?.viewControllers else { return nil } var previous: UIViewController? for vc in viewControllers{ if vc == self { break } previous = vc } return previous }
quelle
Mit Swift mit Wache.
extension UIViewController { func getPreviousViewController() -> UIViewController? { guard let _ = self.navigationController else { return nil } guard let viewControllers = self.navigationController?.viewControllers else { return nil } guard viewControllers.count >= 2 else { return nil } return viewControllers[viewControllers.count - 2] } }
quelle
Meine Erweiterung, schnell 3
extension UIViewController { var previousViewController: UIViewController? { guard let controllers = navigationController?.viewControllers, controllers.count > 1 else { return nil } switch controllers.count { case 2: return controllers.first default: return controllers.dropLast(2).first } } }
quelle
Für Swift 3 können Sie dies tun:
var backtoViewController:UIViewController! for viewController in (self.navigationController?.viewControllers)!.reversed() { if viewController is NameOfMyDestinationViewController { backtoViewController = viewController } } self.navigationController!.popToViewController(backtoViewController, animated: true)
Sie müssen nur "NameOfMyDestinationViewController" durch viewController ersetzen, den Sie zurückgeben möchten.
quelle