新项目暂时告一段落,所以把项目中遇到的问题整理下:
如题,关于导航控制器的跳转 我们最常用的都是以下两种方法,也是最简单的方法
// PUSH
UIViewController *vc = [[UIViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
// PRESENT
UIViewController *vc1 = [[UIViewController alloc] init];
[self presentViewController:vc1 animated:YES completion:nil];
至于对应的返回方法,我相信大家都很清楚 但作为随笔,还是记录下
// 对应PUSH
[self.navigationController popViewControllerAnimated:YES];
// 对应PRESENT
[self dismissViewControllerAnimated:YES completion:nil];
接下来我要说的是我在项目中遇到的问题,如标题 界面A push至 界面C,界面C pop至 界面B
如果只是第一个要求的话,用push方法很简单就能实现;但要实现后面那个要求就难了 为此我查了许多的方法
// 遍历导航控制器
for (UIViewController *controller in self.navigationController.viewControllers) {
if ([controller isKindOfClass:[VRController class]]) {
[self.navigationController popToViewController:controller animated:YES];
}
}
以上是一个方法,经实际体验 无法实现我的要求;至于原理 我有点个人想法:
这个方法是遍历导航控制器,从中取出对应的ViewController 然后pop到对应的ViewController(有人可能会想,从哪取出ViewController 当然是堆栈中取出啦)
说到这里,有朋友可能就反应过来了 我要求界面C pop至 界面B,但界面B并不存在堆栈中 通过这个方法能取得出来?答案当然是不能的,所以这个方法并不适用我的要求
这个方法不适用的主要原因在于界面B不存在堆栈中,也不存在导航控制器内 既然不存在,那我们可以自己添加
UIViewController *vr = [[UIViewController alloc] init];
// 导航控制器的可变数组
NSMutableArray *tempMarr =[NSMutableArray arrayWithArray:self.navigationController.viewControllers];
// 往可变数组中添加你想要添加的ViewController atIndex:1 这个是你想要添加到对应的位置
[tempMarr insertObject:vr atIndex:1];
// 替换导航控制器数组
[self.navigationController setViewControllers:tempMarr animated:YES];
可能有人会好奇我为什么这么写,按以下代码写不行吗?
UIViewController *C = [[UIViewController alloc] init];
[self.navigationController.viewControllers addObject:C];
我能给你的回答是,当然不行,你会发现self.navigationController.viewControllers是不可变数组 所以我只能先把他转换成可变数组
至此,总算能实现我的要求了 最后来段代码总结
- (void)viewDidLoad {
UIViewController *vr = [[UIViewController alloc] init];
// 导航控制器的可变数组
NSMutableArray *tempMarr =[NSMutableArray arrayWithArray:self.navigationController.viewControllers];
// 往可变数组中添加你想要添加的ViewController atIndex:1 这个是你想要添加到对应的位置
[tempMarr insertObject:vr atIndex:1];
// 替换导航控制器数组
[self.navigationController setViewControllers:tempMarr animated:YES];
}
// 返回
- (void)pop{
for (UIViewController *controller in self.navigationController.viewControllers) {
//遍历匹配你想要的ViewController
if ([controller isKindOfClass:[UIViewController class]]) {
[self.navigationController popToViewController:controller animated:YES];
}
}
}
以上代码写在界面C中
其实我这个方法还是从别的地方看来的,最后附上链接一份 看完不懂的朋友或想研究更透彻的朋友可以看看
https://www.jianshu.com/p/3f9ae499d6ca