我可以popup特定的ViewController吗?

我使用基于导航的Application.I推第一个ViewController到第二个ViewController和从第二个ViewController到第三个ViewController现在我想从第三个ViewControllerstream到第一个ViewController.I执行这个任务使用下面的代码,但我的应用程序崩溃。 请任何机构给我一些适当的指导方针。 我不能使用popup到RootViewController,因为它是不同的ViewController.Thanks提前…

在第三个ViewControler我写这个:

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil]; [self.navigationController popToViewController:x animated:NO]; 

通过编写第一行,您将获得所有视图控制器的索引,并从第二行开始到达目的地。

 NSArray *array = [self.navigationController viewControllers]; [self.navigationController popToViewController:[array objectAtIndex:2] animated:YES]; 

一个更安全的方法:

 - (void)turnBackToAnOldViewController{ for (UIViewController *controller in self.navigationController.viewControllers) { //Do not forget to import AnOldViewController.h if ([controller isKindOfClass:[AnOldViewController class]]) { [self.navigationController popToViewController:controller animated:YES]; break; } } } 

Swifty方式:

  let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first! navigationController!.popToViewController(dashboardVC, animated: true) 

通常从堆栈顶端来做这件事更重要,所以:

 - (void)popToLast:(Class)aClass { for (int i=self.navigationController.viewControllers.count-1; i>=0; i--) { UIViewController *vc = self.navigationController.viewControllers[i]; if ([vc isKindOfClass:aClass]) { [self.navigationController popToViewController:vc animated:YES]; break; } } } 

你打电话

 popToLast:[SomeViewController class]; 
 - (void) RetunToSpecificViewController{ for (UIViewController *controller in self.navigationController.viewControllers) { if ([controller isKindOfClass:[AnOldViewController class]]) { //Do not forget to import AnOldViewController.h [self.navigationController popToViewController:controller animated:YES]; break; } } } 
 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; 

你的代码创build了一个从未被压入堆栈的视图的新实例,然后试图回弹到该控制器。

如果你popup回到根视图控制器,你可以使用popToRootViewControllerAnimated:

如果你popup一个已知的距离,你可以调用popViewControllerAnimated:不止一次。 在你的例子中,这将是2个控制器,以便调用。 你可以通过查看控制器2的viewControllers来做同样的事情,然后popup来。

以上build议是快速修复。 一个最佳实践scheme是将您想要返回的控制器传递给您推送的每个后续控制器。 首先将自己传递给第二次,第二次传递,引用第三次,第三次传递给传递的引用,这是第一次。

实际上,您正在创build一个临时根控制器。 你可以popToTemporaryRootViewControllerAnimated: UINavigationController并添加一个临时根目录属性和一个popToTemporaryRootViewControllerAnimated:方法,它会popup到你的临时根目录并清除它。 当第一次推秒时,它也会将自己设置为临时根,这样堆栈中的每个控制器都不必传递一个引用。 你将不得不添加一些额外的检查,以确定你永远不会popup临时根目录没有清除它。

经过许多努力,人们已经迅速扩展到Swift 3.0中的特定视图控制器。

 extension UINavigationController { func backToViewController(viewController: Swift.AnyClass) { for element in viewControllers as Array { if element.isKind(of: viewController) { self.popToViewController(element, animated: true) break } } } } 

方法调用:

  self.navigationController?.backToViewController(viewController: YourViewController.self) 

快速安全的Swift 3版本:

 if let vc = navigationController.viewControllers.filter({ $0 is SpecificViewControllerClass }).first { navigationController.popToViewController(vc, animated: true) } 

Swift 3.0中实现和testing

以下是可用于导航到任何特定视图控制器的方法:

 func poptoSpecificVC(viewController : Swift.AnyClass){ let viewControllers: [UIViewController] = self.navigationController!.viewControllers for aViewController in viewControllers { if aViewController.isKind(of: viewController) { self.navigationController!.popToViewController(aViewController, animated: true) break; } } } 

用法:

 self.poptoSpecificVC(viewController: createIntervalVC.self) 

我认为.filter({...}).first.first(where: {...})慢一点。 这也可以写得更精确,只解决UIViewControllers。

 extension UINavigationController { func popToController<T: UIViewController>(_ type: T.Type, animated: Bool) { if let vc = viewControllers.first(where: { $0 is T }) { popToViewController(vc, animated: animated) } } func popToControllerOrToRootControllerIfNotInTheStack<T: UIViewController>(_ type: T.Type, animated: Bool) { if let vc = viewControllers.first(where: { $0 is T }) { popToViewController(vc, animated: animated) } else { popToRootViewController(animated: animated) } } } 

更新了Swift 3:

使用下面的简单代码,用于popup到特定的视图控制器;

  for vc in self.navigationController!.viewControllers as Array { if vc.isKind(of: YourViewControllerName) { self.navigationController!.popToViewController(vc, animated: true) break } }