导航控制器的跳转:界面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

 

posted @ 2019-04-19 13:57  卖身的小男孩  阅读(325)  评论(0编辑  收藏  举报