我创建了一个带有串行视图的应用程序(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>”
我已尝试过但未能使用rangeOfString
和hasPrefix
来获取“B”视图的索引。
答案 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的展开操作之前调用)。