Ios 如何从navigationController(viewController/stack)弹出指定viewController?

Ios 如何从navigationController(viewController/stack)弹出指定viewController?,ios,uinavigationcontroller,viewcontroller,Ios,Uinavigationcontroller,Viewcontroller,我已经创建了一个具有串行视图(A、B、C、D等)的应用程序,需要将D弹回到B。 有人可能会说为什么不使用: [self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:1] animated:YES]; 然而,这并不是一个好的解决办法。因为这个方法需要你得到我们的“B”存储在其中的索引 问题:如何获取ViewController中“B”的索引

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

[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:1] animated:YES];
然而,这并不是一个好的解决办法。因为这个方法需要你得到我们的“B”存储在其中的索引

问题:如何获取ViewController中“B”的索引

UIViewControllers
中的格式应为:
”, “”, “”, “”, “


我尝试使用
rangeOfsString
hasPrefix
获取“B”视图的索引,但失败。

您可能可以执行以下操作:

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

更新:

在iOS 6中,您只需使用unwind segues即可,它为您解决所有这些问题。只需转到B类,定义一个展开操作(通过组合
iAction
返回类型和
UIStoryboardSegue
参数来识别),例如:


然后,由B显示的任何控制器都可以创建一个展开序列,例如,通过控制从按钮拖动到场景驳接中的退出图标。您可以选择让要从中展开的控制器执行预期的
prepareforsgue
(在B的展开操作之前调用).

在这里,我想知道NavigationController通过堆栈的
概念来管理ViewController
。即
最后一个先出的方法

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
将位于第三位,那么您能做些什么

您可以按如下方式硬连接索引

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

我希望它能对你有所帮助。

查找展开段。这里有一些关于他们的问题。这就是你想要使用的。@Lothario我已经更新了我的解圈步骤的答案,它完成了同样的事情(还有更多)。但这只是iOS 6或更高版本。
  [self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];