导航控制器原理:
- 导航控制器:是一个容器视图控制器,专门用来管理其他的视图控制器,导航控制器管理的视图控制器在导航控制器中的存储结构是栈结构;
- 导航控制器永远显示栈顶的那个视图控制器,
- 让一个导航控制器去管理其他视图控制器的方法:
(1) 将视图控制器作为导航控制器的根视图控制器,
(2) 使用导航控制器push出来的视图控制器,也是属于导航控制器的视图控制器
__block BOOL isPop = NO;
//采用倒序循环返回到离当前控制器最近的匹配控制器(根据需求确定)
[self.navigationController.viewControllers enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString *vcName = NSStringFromClass([obj class]);
NSLog(@"控制器名称: %@ index=%ld", vcName, idx);
if ([vcName isEqualToString:NSStringFromClass([FirstViewController class])] ||
[vcName isEqualToString:NSStringFromClass([SecondViewController class])]) {
[self.navigationController popToViewController:obj animated:YES];
isPop = YES;
*stop = YES;
}
}];
//栈中未找到匹配的控制器时统一返回
if (!isPop) {
self.tabBarController.selectedIndex = 0;
[self.navigationController popToRootViewControllerAnimated:YES];
}
若需要删除当前控制器,比如:订单确认页面跳转到支付页面,无论是否成功皆不会返回到此界面时。
NSMutableArray*vcMutArr = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[vcMutArr removeObject:self];
[self.navigationController setViewControllers:vcMutArr animated:YES];
需求若为删除多个控制器,可结合倒序遍历可变数组删除目标控制器,然后赋值给导航控制器的方式。
首次写技术性的东西,若发现错误,欢迎斧正,我会及时更新,感激不尽!