Chcę przejść do trzeciego widoku stosu nawigacyjnego z powrotem do pierwszego widoku.
Wiem, jak wyświetlić jeden widok naraz:
[self.navigationController popViewControllerAnimated:YES];
Ale jak mam zrobić dwa na raz?
ios
iphone
uinavigationcontroller
Adam Waite
źródło
źródło
Odpowiedzi:
Możesz spróbować również przeskoczyć między stosem kontrolera nawigacji
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]]; for (UIViewController *aViewController in allViewControllers) { if ([aViewController isKindOfClass:[RequiredViewController class]]) { [self.navigationController popToViewController:aViewController animated:NO]; } }
źródło
Oto dwa
UINavigationController
rozszerzenia, które mogą rozwiązać Twój problem. Poleciłbym użyć pierwszego, który pojawia sięUIViewController
na określonej klasie: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) } } }
i użyj go w ten sposób:
// pop to SomeViewController class navigationController?.popToViewController(ofClass: SomeViewController.self) // pop 2 view controllers navigationController?.popViewControllers(viewsToPop: 2)
źródło
removeLast
justremoveLast(2)
.let vc = viewControllers[viewControllers.count - viewsToPop + 1]
, aby działać poprawnie musisz je zastąpić:let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]
lublet vc = viewControllers[viewControllers.count - viewsToPop - 1]
Możesz przejść do "głównego" (pierwszego) kontrolera widoku za pomocą
popToRootViewControllerAnimated
:[self.navigationController popToRootViewControllerAnimated:YES]; // If you want to know what view controllers were popd: // NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationController
Odniesienie :źródło
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
objectAtIndex: 1 -> możesz przekazać dowolny indeks, do którego chcesz przeskoczyć
źródło
Swift 2 - xCode 7.3.1
To może być bardzo przydatne rozszerzenie do uruchamiania UIViewControllers:
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") } } }
źródło
Jeśli chcesz po prostu uruchomić 2 naraz, ponieważ twój rootViewController jest (o wiele) `` głębszy '', możesz rozważyć dodanie kategorii do UIviewController, na przykład:
UINavigationController + popTwice.h
#import <UIKit/UIKit.h> @interface UINavigationController (popTwice) - (void) popTwoViewControllersAnimated:(BOOL)animated; @end
UINavigationController + popTwice.m
#import "UINavigationController+popTwice.h" @implementation UINavigationController (popTwice) - (void) popTwoViewControllersAnimated:(BOOL)animated{ [self popViewControllerAnimated:NO]; [self popViewControllerAnimated:animated]; } @end
Zaimportuj kategorię
#import "UINavigationController+popTwice.h"
gdzieś w swojej implementacji i użyj tego wiersza kodu, aby uruchomić 2 kontrolery naraz:[self.navigationController popTwoViewControllersAnimated:YES];
czy to nie wspaniałe? :)
źródło
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) } }
Następnie użyj tej metody
self.popViewControllerss(popViews: 2)
źródło
Możesz także spróbować tego: -
[self.navigationController popToViewController:yourViewController animated:YES];
źródło
//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];
źródło
NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]]; [newStack removeLastObject]; [newStack removeLastObject]; [self.navigationController setViewControllers:newStack animated:YES];
źródło
W Swift 3 możesz w ten sposób zdjąć jeden, dwa lub więcej kontrolerów widoku z kontrolera nawigacyjnego
let viewControllers = self.navigationController!.viewControllers as [UIViewController] for aViewController:UIViewController in viewControllers { if aViewController.isKind(of: FromWhereYouWantToGoController.self) { _ = self.navigationController?.popToViewController(aViewController, animated: true) } }
Tutaj FromWhereYouWantToGoController jest kontrolerem docelowym. Mam nadzieję, że to pomoże.
źródło
Możesz przekazać początkowy kontroler widoku (ten, do którego chcesz wrócić), a następnie wywołać tę linię w ostatnim widoku:
[self.navigationController popToViewController:yourInitialViewController animated:YES];
L.
źródło
Nie widziałem tutaj tej odpowiedzi. Jeśli chcesz pobrać tylko kilka (nie do samego katalogu głównego), możesz po prostu wykonać iterację przez self.navigationController.viewControllers sprawdzanie typów klas lub jeśli masz odniesienie, użyj tego:
for (UIViewController *aViewController in self.navigationController.viewControllers) { if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) { [self.navigationController popToViewController:aViewController animated:YES]; } }
źródło
możesz wrócić do głównego kontrolera widoku
[self.navigationController popToRootViewControllerAnimated:YES];
lub, jeśli widok, do którego chcesz się przeskoczyć, nie jest pierwszym, będziesz musiał ponownie wyświetlić widok w widoku poprzedniego widoku
źródło
Oto mała funkcja, której używam, aby wrócić do X ViewControllers:
-(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]; } }
źródło
Wersja Swift z (Swift 1.2 / Xcode 6.3.1) poppingu dwukrotnie lub więcej
var viewControllers = self.navigationController?.viewControllers viewControllers?.removeLast() viewControllers?.removeLast() self.navigationController?.setViewControllers(viewControllers, animated: true)
lub
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)
źródło
Możesz użyć stosu UIViewControllers. 1. Pobierz tablicę wszystkich viewControllerów ze stosu. 2. Przejdź przez całą tablicę i znajdź żądany kontroler viewController
, dopasowując typ klasy. 3. Otwórz 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) } } }
źródło
Korzystanie z prostego rozszerzenia UINavigationController :
extension UINavigationController { func popViewControllers(_ count: Int) { guard viewControllers.count > count else { return } popToViewController(viewControllers[viewControllers.count - count - 1], animated: true) } }
źródło