导航控制器的跳转:界面A push 到界面C,界面C pop 回界面A
新项目暂时告一段落,所以把项目中遇到的问题整理下:
如题,关于导航控制器的跳转 我们最常用的都是以下两种方法,也是最简单的方法
// 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