在我的应用程序中,我想从视图控制器堆栈中删除视图控制器,然后导航到特定的视图控制器。假设我有A,B,C,D,E视图控制器堆栈。我想删除E然后转到C.我使用以下代码
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers)
{
if ([aViewController isKindOfClass:[noNetworkViewController class]])
{
[aViewController removeFromParentViewController];
}
}
NSMutableArray *allbViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allbViewControllers)
{
if ([aViewController isKindOfClass:[messageViewController class]])
{
[self.navigationController popToViewController:aViewController animated:NO];
}
}
第一个for循环擦除堆栈中的所有视图控制器。我在这里做错了吗?请告诉我。
答案 0 :(得分:1)
使用removeFromParentViewController:你不应该使用导航控制器的视图控制器堆栈。永远。这是完全错误的。
此外,没有理由循环通过导航控制器的视图控制器堆栈并逐个弹出它们。有一些方法,比如popToViewController:animated:和popToRootViewController,可以通过一次调用弹出到堆栈中的任意视图控制器。
答案 1 :(得分:0)
如果您使用的是pop,则不必从其父视图中删除其他视图。您可以弹出到视图控制器阵列中的视图控制器,然后从堆栈顶部返回两个视图控制器。
我会给出一个代码示例,但我不在我的开发计算机上。如果没有人在明天之前回答更多细节,我会添加一些代码。
-Edit - 这是我用来弹回2个视图控制器的代码行。我相信这可以做得更好,但是有效。
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:[self.navigationController.viewControllers count]-3] animated:YES];
答案 2 :(得分:0)
您是否已验证导航控制器是否填充了父视图控制器属性?父视图控制器通常用于UIViewControllerContainment协议一致性。 UINavigationController不符合该协议,这使我认为您无法通过调用该方法将其从导航控制器中删除。您可以在navigationController上使用--setViewControllers:animated:来分配控制器。只需使用您使用所有viewControllers创建的数组。