我可以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 } }