我可以弹出特定ViewController吗?

时间:2010-06-12 05:05:26

标签: iphone uinavigationcontroller popviewcontroller

我正在使用基于导航的应用程序。我将First ViewController推送到Second ViewController,从Second ViewController推送到Third ViewController。现在我想从Third ViewController弹出到First ViewController。我正在使用下面的代码执行此任务,但我的应用程序崩溃了。

请任何机构给我一些适当的指导。我不能使用pop到rootViewController,因为它是不同的viewController。提前谢谢......

在第三个ViewControler中,我写了这个:

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

15 个答案:

答案 0 :(得分:92)

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

NSArray *array = [self.navigationController viewControllers];

[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];

答案 1 :(得分:75)

更安全的方法:

- (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;
        }
    }
}

答案 2 :(得分:14)

Swifty方式:

<div class="main-container">
<div class="background">
  <div class="layer">
</div>
</div>
<div class="cities"><p>
<button class="btn btn-1 btn-1f"><a href="#">Bangalore</a></button>   
</p> 
</div>

答案 3 :(得分:7)

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

答案 4 :(得分:6)

通常从堆栈顶部执行此操作更为重要,因此:

- (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];

答案 5 :(得分:5)

- (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;
            }
    }
}

答案 6 :(得分:2)

快速安全 Swift 3 版本:

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

答案 7 :(得分:1)

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

如果要弹回根视图控制器,可以使用popToRootViewControllerAnimated:

如果您回弹已知距离,可以多次拨打popViewControllerAnimated:。在您的示例中,这将是2个控制器,因此对于调用。你可以通过从viewControllers查看控制器2的结尾并弹出它来做同样的事情。

以上建议是快速解决方法。一种最佳实践方案是将要返回的控制器传递给您推送的每个连续控制器。首先将自身传递给第二次,第二次传递,引用第三次,第三次传递给传递的引用,这是第一次。

实际上,您正在创建临时根控制器。您可以继承UINavigationController并添加temporaryRoot属性和popToTemporaryRootViewControllerAnimated:方法,该方法将弹出到您的临时根并清除它。当第一次按秒时,它也会将自己设置为临时根,以便堆栈中的每个控制器都不必传递引用。您必须添加一些额外的检查,以确保您不会在不清除它的情况下突然跳过temporaryRoot。

答案 8 :(得分:1)

已实施&amp;在 Swift 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)

答案 9 :(得分:1)

我认为<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <form id="form" action="" > <br /> <input type="submit" value="Click!" id="start-loader"/> </form> <img id="loader-gif" src="http://www.autopricemanager.com/img/widget-loader-lg-en.gif" alt="" />.filter({...}).first慢一点。 另外,这可以更精确地编写以仅处理UIViewControllers。

.first(where: {...})

答案 10 :(得分:1)

  

针对Swift 3进行了更新:

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

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

答案 11 :(得分:1)

Swift 4 版本

if let viewController = navigationController?.viewControllers.first(where: {$0 is YourViewController}) {
      navigationController?.popToViewController(viewController, animated: false)
}

您可以根据需要在.viewControllers.first上指定另一个过滤器,例如,假设您有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)
   }

答案 12 :(得分:0)

for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: LoginVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

答案 13 :(得分:0)

将功能放入UIViewController 1.它检查特定UIViewController是否存在于UINavigationController然后popToViewControllerpushViewController

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)

答案 14 :(得分:0)

我在这里有答案。这是 Swift> 4.X

的100%工作代码

How can I pop specific View Controller in Swift