最近项目中有个需求,需要pop到指定的控制器页面,比较郁闷的是该控制器并没有在导航控制器的栈中,常用的pop方法并不能直接使用.常用的pop到上一级的方法有两种:
-
1 推出到根视图控制器
[self.navigationController popToRootViewControllerAnimated:YES];
-
2 推出到指定的视图控制器
for (UIViewController *controller in self.navigationController.viewControllers) { if ([controller isKindOfClass:[ExampleController class]]) { ExampleController *e =(ExampleController *)controller; [self.navigationController popToViewController:e animated:YES]; } } ExampleController为指定pop到的控制器
所遇到问题的解决方案是:
int currentIndex = 0;
for (UIViewController *controller in self.navigationController.viewControllers) {
if ([controller isKindOfClass:[LastController class]]) {
// 初始化将要push的控制器
ExamleController *newVC = [[ExamleController alloc] init];
// 获取当前栈中的控制器数组
NSMutableArray *vcArray = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
NSLog(@"设置前:vcArray == %@", vcArray);
// 获取当前控制器在栈中的位置
int index = currentIndex;
// 移除当前路由器
[vcArray removeObjectAtIndex:index];
// 添加新控制器
[vcArray insertObject:newVC atIndex:(index - 1)];
// 重新设置当前导航控制器的路由数组
[self.navigationController setViewControllers:vcArray animated:YES];
NSLog(@"设置后:the vcArray == %@", vcArray);
[self.navigationController popToViewController:newVC animated:YES];
break;
}
currentIndex ++;
}
LastController : 当前显示控制器的上一级控制器
ExamleController : 未在栈中,需要pop到的控制器