我可以弹出特定ViewController吗?

Ank*_*yas 48 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];
Run Code Online (Sandbox Code Playgroud)

Ank*_*yas 93

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

NSArray *array = [self.navigationController viewControllers];

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

  • 或者,对于一个班轮作弊的人:[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES]; (4认同)

Yun*_*hel 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 本机方法是消息popToViewController:animated,而不是您为消息提供参数的方式.我相信这个解决方案更安全,因为当你说[array objectAtIndex:2]时,你会自动认为VC的数量大于2.如果不是这样的话,程序就会崩溃,我的解决方案会停滞不前如果没有所需VC的实例,则崩溃. (6认同)
  • @morroko如果它不在堆栈中,你就无法进入它.您可以推送它,也可以在viewControllers堆栈中手动插入它(它是一个公共的,读写NSArray属性) (2认同)

小智 15

顺畅的方式:

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


Vik*_*mar 7

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


小智 7

斯威夫特 4版本

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

您可以.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)
   }
Run Code Online (Sandbox Code Playgroud)


Les*_*rna 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你打电话给那个

popToLast:[SomeViewController class];
Run Code Online (Sandbox Code Playgroud)


Mah*_*a Y 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;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)