我可以弹到特定的ViewController?
-
26-09-2019 - |
题
我使用基于导航应用。我把第一次的ViewController第二视图控制器和第二的ViewController到三视图控制器。现在,我想从三视图控制器到第一ViewController.I流行正在执行使用下面的代码,但我的应用程序崩溃这一任务。
请任何机构给我一些适当的指导方针。我无法使用POP RootViewController的,因为它是不同的viewController。由于事先...
<强>在第三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];
return;
}
}
}
SWIFTY方式:
let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
navigationController!.popToViewController(dashboardVC, animated: true)
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
通常更重要的是要做到这一点,从堆栈的顶部,这样:
- (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;
}
}
}
快速安全的夫特3 版本:
if let vc = navigationController.viewControllers.filter({ $0 is SpecificViewControllerClass }).first {
navigationController.popToViewController(vc, animated: true)
}
您的代码创建一个从未被压入堆栈的图的一个新实例,然后试图弹出返回该控制器。
如果你正在弹出回到根视图控制器,你可以使用popToRootViewControllerAnimated:
如果您在弹出回来已知的距离,你可以不止一次打电话popViewControllerAnimated:
。在你的榜样,那将是2个控制器,以便将呼叫。您可以通过在viewControllers
寻找控制器从2月底和弹出它做同样的事情。
上面的建议是快速修复。一个最佳实践方案将通过你想跟着你把每个连续控制器返回到控制器。首先通过本身到第二,第二传递该参考第三,第三弹出到传递的参考,这是第一个。
在效果,要创建一个临时的根控制器。你可以继承UINavigationController
并添加temporaryRoot
财产,会弹出来临时根并清除它popToTemporaryRootViewControllerAnimated:
方法。当第一推秒,它也将自身设置为临时根,使得在堆叠每个控制器不必围绕传递一个参考。你将不得不添加一些额外的检查,以不确定你永远不会弹出过去temporaryRoot不清除它。
在很多努力某人的创造背面的迅速扩展到特定的视图控制器在夫特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)
实现&在测试的夫特3.0 强>
下面是方法,其可以用于导航有用于任何特定的视图控制器:
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)
}
}
}
更新了夫特3:
下面简单的代码用于,弹出到特定视图控制器;
for vc in self.navigationController!.viewControllers as Array {
if vc.isKind(of: YourViewControllerName) {
self.navigationController!.popToViewController(vc, animated: true)
break
}
}
<强>夫特4 版本
if let viewController = navigationController?.viewControllers.first(where: {$0 is YourViewController}) {
navigationController?.popToViewController(viewController, animated: false)
}
您可以指定在.viewControllers.first
另一个过滤器根据自己的需要e.g比方说,如果你有居住在导航控制器视图控制器的相同kind
,那么你可以指定象下面
if let viewController = navigationController?.viewControllers.first(where: {
if let current = $0 as? YourViewController {
return current.someProperty == "SOME VALUE"
}
return false } ) {
navigationController?.popToViewController(viewController, animated: false)
}
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: LoginVC.self) {
_ = self.navigationController!.popToViewController(controller, animated: true)
break
}
}
在UIViewController
将功能
1.它检查是否具体UIViewController
存在在UINavigationController
然后popToViewController
要不然pushViewController
func navigate(_ navVC: AnyClass, pushVC: UIViewController) {
for obj in self.navigationController!.viewControllers {
if obj.isMember(of: navVC) {
self.navigationController!.popToViewController(obj, animated: true)
return
}
}
self.navigationController!.pushViewController(pushVC, animated: true)
}
使用
self.navigate(ViewController.self, pushVC: self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController)
我的答案在这里。为这是100%的工作代码的夫特> 4.X 强>