如何弹回以从navigationController(viewControllers / stack)指定viewController?

时间:2012-11-15 07:45:53

标签: ios uinavigationcontroller viewcontroller

我创建了一个带有串行视图的应用程序(A,B,C,D,...),我需要将D弹回到B. 有人可能会说为什么不使用:

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

然而,这不是一个好的解决方案。因为这个方法需要你得到我们“B”存储的索引。

问题:如何在viewControllers中获取“B”的索引?

UIViewControllers中的

格式应为:
    “< A:0x6e70710>”,     “< C:0x6e30370>”,     “< B:0x6988a70>”,     “< D:0x6ea8950>”,     “< E:0x6eaaad0>”

我已尝试过但未能使用rangeOfStringhasPrefix来获取“B”视图的索引。

2 个答案:

答案 0 :(得分:14)

在这里,我想知道NavigationController通过Concept Of Stack管理ViewController。即LAST COME FIRST OUT。这是两种做同样的方法。

1)在这里你可以进行迭代以获得理想的ViewController如下

  for (id controller in [self.navigationController viewControllers])
   {
   if ([controller isKindOfClass:[BViewController class]])
  {
    [self.navigationController popToViewController:controller animated:YES];
    break;
  }
  }

2)这里有A,B,C,D个控制器。意味着B将位于第3位,那么你能做什么

您可以将索引硬连接到下面

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

我希望它对你有所帮助..

答案 1 :(得分:8)

您可以执行以下操作:

for (UIViewController *controller in [self.navigationController viewControllers])
{
    if ([controller isKindOfClass:[B class]])
    {
        [self.navigationController popToViewController:controller animated:YES];
        break;
    }
}

<强>更新

在iOS 6中,您可以使用unwind segue,它可以为您完成所有这些操作。只需转到您的B类,定义一个展开动作(通过IBAction返回类型和UIStoryboardSegue参数的组合来识别),例如:

- (IBAction)done:(UIStoryboardSegue *)segue
{
    // do any clean up you want
}

然后,由B呈现的任何控制器都可以通过例如 control - 从按钮拖动到场景停靠栏中的退出图标来创建展开segue。您可以选择让您正在展开的控制器执行预期的prepareForSegue(在B的展开操作之前调用)。