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?
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?
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];
}
}
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)
removeLast
just removeLast(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 :
Zdejmuje wszystkie kontrolery widoku na stosie z wyjątkiem głównego kontrolera widoku i aktualizuje wyświetlacz.
Wartość
zwracana Tablica kontrolerów widoku, które są zdejmowane ze stosu.
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")
}
}
}
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:
#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
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? :)
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)
}
}
Następnie użyj tej metody
self.popViewControllerss(popViews: 2)
//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];
NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
[newStack removeLastObject];
[newStack removeLastObject];
[self.navigationController setViewControllers:newStack animated:YES];
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.
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];
}
}
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];
}
}
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)
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)
}
}
}
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)
}
}