Ich möchte zur dritten Ansicht des Navigationsstapels zurück zur ersten Ansicht.
Ich weiß, wie man eine Ansicht auf einmal öffnet:
[self.navigationController popViewControllerAnimated:YES];
Aber wie mache ich zwei gleichzeitig?
Vielen Dank...
Sie können dies auch versuchen, zwischen dem Navigationscontroller-Stack zu springen
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
if ([aViewController isKindOfClass:[RequiredViewController class]]) {
[self.navigationController popToViewController:aViewController animated:NO];
}
}
Hier sind zwei UINavigationController
-Erweiterungen, die Ihr Problem lösen können. Ich würde empfehlen, die erste zu verwenden, die auf einen UIViewController
einer bestimmten Klasse verweist:
extension UINavigationController {
func popToViewController(ofClass: AnyClass, animated: Bool = true) {
if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
popToViewController(vc, animated: animated)
}
}
func popViewControllers(viewsToPop: Int, animated: Bool = true) {
if viewControllers.count > viewsToPop {
let vc = viewControllers[viewControllers.count - viewsToPop - 1]
popToViewController(vc, animated: animated)
}
}
}
und benutze es so:
// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)
// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
Sie können mit popToRootViewControllerAnimated
zum "root" (ersten) View-Controller wechseln:
[self.navigationController popToRootViewControllerAnimated:YES];
// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationController
Referenz :
Hebt alle View-Controller auf dem Stack mit Ausnahme des Root-View-Controllers auf und aktualisiert die Anzeige.
Rückgabewert
Ein Array von View-Controllern, die vom Stapel entfernt werden.
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
objectAtIndex: 1 -> Sie können den Index übergeben, zu dem Sie wechseln möchten
Swift 2 - xCode 7.3
Dies könnte eine sehr nützliche Erweiterung für UIViewControllers sein:
extension UINavigationController {
func popToViewControllerOfType(classForCoder: AnyClass) {
for controller in viewControllers {
if controller.classForCoder == classForCoder {
popToViewController(controller, animated: true)
break
}
}
}
func popViewControllers(controllersToPop: Int, animated: Bool) {
if viewControllers.count > controllersToPop {
popToViewController(viewControllers[viewControllers.count - (controllersToPop + 1)], animated: animated)
} else {
print("Trying to pop \(controllersToPop) view controllers but navigation controller contains only \(viewControllers.count) controllers in stack")
}
}
}
Wenn Sie einfach nur 2 auf einmal platzieren möchten, weil Ihr rootViewController (Weg) "tiefer" ist, dann können Sie 2 eine Kategorie zu UIviewController hinzufügen:
#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated;
@end
#import "UINavigationController+popTwice.h"
@implementation UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated{
[self popViewControllerAnimated:NO];
[self popViewControllerAnimated:animated];
}
@end
Importieren Sie die Kategorie #import "UINavigationController+popTwice.h"
an einer beliebigen Stelle in Ihrer Implementierung, und verwenden Sie diese Codezeile, um zwei Controller gleichzeitig zu öffnen:
[self.navigationController popTwoViewControllersAnimated:YES];
ist das nicht toll? :)
//viewIndex = 1;
//viewIndex = 2;
//viewIndex = 3;
// **[viewControllers objectAtIndex: *put here your viewindex number*]
NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:[viewControllers objectAtIndex:viewIndex] animated:NO];
Sie können dieses auch versuchen: -
[self.navigationController popToViewController:yourViewController animated:YES];
NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
[newStack removeLastObject];
[newStack removeLastObject];
[self.navigationController setViewControllers:newStack animated:YES];
In Swift 3 , Können Sie einen, zwei oder mehr Viewcontroller von einem Navigationscontroller auf diese Weise platzieren
let viewControllers = self.navigationController!.viewControllers as [UIViewController]
for aViewController:UIViewController in viewControllers {
if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
_ = self.navigationController?.popToViewController(aViewController, animated: true)
}
}
Hier ist FromWhereYouWantToGoController der Zielcontroller. Ich hoffe es hilft.
Sie können den anfänglichen View-Controller (den Controller, auf den Sie zurückkehren möchten) übergeben und dann in der letzten Ansicht diese Zeile aufrufen:
[self.navigationController popToViewController:yourInitialViewController animated:YES];
L.
Ich habe diese Antwort hier nicht gesehen. Wenn Sie nur einige (nicht den ganzen Weg zum Stammverzeichnis) platzieren möchten, können Sie einfach durch self.navigationController.viewControllers nach Klassentypen durchlaufen, oder wenn Sie eine Referenz haben, verwenden Sie das
for (UIViewController *aViewController in self.navigationController.viewControllers) {
if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
[self.navigationController popToViewController:aViewController animated:YES];
}
}
Hier ist eine kleine Funktion, die ich verwende, um X ViewControllers zurückzukehren:
-(void)backMultiple:(id)data {
int back = 2; //Default to go back 2
int count = [self.navigationController.viewControllers count];
if(data[@"count"]) back = [data[@"count"] intValue];
//If we want to go back more than those that actually exist, just go to the root
if(back+1 > count) {
[self.navigationController popToRootViewControllerAnimated:YES];
}
//Otherwise go back X ViewControllers
else {
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:count-(back+1)] animated:YES];
}
}
sie können zum Root-View-Controller zurückkehren
[self.navigationController popToRootViewControllerAnimated:YES];
wenn die Ansicht, zu der Sie wechseln möchten, nicht die erste ist, müssen Sie sie erneut in der Ansicht viewAppear Ihrer vorherigen Ansicht aufrufen
Sie können den Stack der UIViewControllers verwenden. 1. Holen Sie das Array aller viewControllers im Stack . 2. Durchlaufen Sie das gesamte Array und suchen Sie den gewünschten viewController
durch Übereinstimmung mit dem Klassentyp . 3. Pop den viewController.
func popToSpecificViewC
{
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
for viewController:UIViewController in viewControllers
{
if viewController.isKind(of: WelcomeViewC.self)
{
_ = self.navigationController?.popToViewController(viewController, animated: true)
}
}
}
Swift-Version ab (Swift 1.2/Xcode 6.3.1) Zweimal oder mehr
var viewControllers = self.navigationController?.viewControllers
viewControllers?.removeLast()
viewControllers?.removeLast()
self.navigationController?.setViewControllers(viewControllers, animated: true)
oder
var viewControllers = self.navigationController?.viewControllers
var viewsToPop = 2
var end = (viewControllers?.count)!
var start = end - viewsToPop
viewControllers?.removeRange(Range<Int>(start: start, end: end))
self.navigationController?.setViewControllers(viewControllers, animated: true)
Swift 4:
func popViewControllerss(popViews: Int, animated: Bool = true) {
if self.navigationController!.viewControllers.count > popViews
{
let vc = self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - popViews - 1]
self.navigationController?.popToViewController(vc, animated: animated)
}
}
Dann verwenden Sie diese Methode
self.popViewControllerss(popViews: 2)