如何从导航控制器一次弹出两个视图?

Ada*_*ite 85 iphone uinavigationcontroller ios

我想弹出导航堆栈上的第三个视图回到第一个视图.

我知道如何一次弹出一个视图:

[self.navigationController popViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

但我怎么一次做两个呢?

谢谢...

Mee*_*eet 129

您也可以尝试在导航控制器堆栈之间跳转

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
    if ([aViewController isKindOfClass:[RequiredViewController class]]) {
        [self.navigationController popToViewController:aViewController animated:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是最好的方法,但你应该使用self.navigationcontroller来引用你的uinavigation控制器 (6认同)
  • 迭代原始navigator-> viewControllers数组时也可以工作(不需要将它转换为可变数组) (3认同)
  • 我同意,如果用户想要将堆栈弹回到某个viewcontroller,这是最好的解决方案.假设您不知道哪个视图控制器,您仍然可以实现一个系统,您可以在其中指定要从堆栈弹出多少个视图控制器,并使用objectAtIndex从allViewControllers数组中获取目标视图控制器:(allViewControllers.count - 1 - 金额).-1因为数组是基于零的. (2认同)

bud*_*ino 60

以下是两个UINavigationController可以解决您问题的扩展.我建议使用弹出UIViewController特定类的第一个:

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)
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)

// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
Run Code Online (Sandbox Code Playgroud)

  • 对于Swift(选项1),您可以用`removeLast(2)`替换两个`removeLast`. (3认同)

cho*_*own 43

您可以使用以下命令弹出"root"(第一个)视图控制器popToRootViewControllerAnimated:

[self.navigationController popToRootViewControllerAnimated:YES];

// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

UINavigationController参考:

弹出除根视图控制器之外的堆栈上的所有视图控制器并更新显示.

返回值
从堆栈弹出的视图控制器数组.


Zar*_*aki 29

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];   
Run Code Online (Sandbox Code Playgroud)

objectAtIndex:1 - >您可以传递要弹出的索引


lub*_*lis 18

Swift 2 - xCode 7.3

这可能是弹出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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这需要更多的推动......我正准备写这个扩展.我会用你的谢谢;) (2认同)

Tie*_*eme 15

如果你只是想一次弹出2,因为你的rootViewController是"更深",那么你可以考虑在UIviewController中添加一个类别,例如:

UINavigationController的+ popTwice.h

#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated;

@end
Run Code Online (Sandbox Code Playgroud)

UINavigationController的+ popTwice.m

#import "UINavigationController+popTwice.h"

@implementation UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated{
    [self popViewControllerAnimated:NO];
    [self popViewControllerAnimated:animated];
}

@end
Run Code Online (Sandbox Code Playgroud)

#import "UINavigationController+popTwice.h"在实现中的某处导入类别,并使用以下代码行一次弹出2个控制器:

[self.navigationController popTwoViewControllersAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

那不是很好吗?:)

  • 你可以传递一个参数来查看popControllers的数量,然后换行[self popViewControllerAnimated:NO]; 在一个for循环中,count-1. (8认同)
  • 如果你需要弹出三个视图,你会写"UINavigationController + popThrice.m"?????? (6认同)
  • 很好,嗯..为什么不:D (2认同)

Lee*_*ena 6

你也可以尝试这个: -

[self.navigationController popToViewController:yourViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)


Sab*_*esh 6

//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];
Run Code Online (Sandbox Code Playgroud)


Sai*_*daf 6

斯威夫特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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用此方法

self.popViewControllerss(popViews: 2)
Run Code Online (Sandbox Code Playgroud)