[绍棠] iOS 各个界面相互push 以及 如何判断当前页面是push进入还是present进入

来源:互联网 发布:淘宝的淘金币在哪里 编辑:程序博客网 时间:2024/05/18 04:54
如A、B、C、D 四个视图控制器,

想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop 的A


解决方法如下:

1.假如此时在 A 控制器下,想要到 push 到 B, 可以这样写

[self.navigationController pushViewController: B :YES];

这时 self.navigationController.viewControllers 中按顺序含有 [A,B]

2.此时已经到 B 控制器下了, 接下来是 push 到 D, 可以这样写

[self.navigationController pushViewController: D :YES];

这时 self.navigationController.viewControllers 中按顺序含有 [A,B,D]
接下来很重要,很重要,很重要

如何想从 D pop 到 C, 看数组[A,B,D] 中压根就没有C 该如何pop 到C呢?
这时就需要对这个数组进行修改,将C 加入进去
于是 你会如下写:

[self.navigationController.viewControllers addObject:C];

发现报错,这是因为self.navigationController.viewControllers
是不可变数组,没办法了,我们只好转换一下了:

NSMutableArray*tempMarr =[NSMutableArrayarrayWithArray:self.navigationController.viewControllers];

此时再加入C 就容易多了,咦,聪明的你会发现从 D pop C 不能直接将 C直接 addObject;
当然,我会这样做:

[tempMarr insertObject:C atIndex:tempMarr.count- 2];

这时候 tempMarr 是这样的 [A,B,C,D], 可是 要想 从 C pop 到 A ,数组中就不能有 B

就需要 将tempMarr 变成 [A,C,D] ,至于怎么变,你比我懂得多,

懂得思考的同学会发现 这时的self.navigationController.viewControllers 依然是 [A,B,D], 不用急,不用怕navigationController 有这样一个方法, 可以搞定,如下:

[self.navigationController setViewControllers:tempMarr animated:YES];

有的同学会说,这不是直接把 B 替换 成 C 吗

看上去是这样,可是跳转的时机,时机,时机重要的事情说三遍,还有视图的切换,切换,切换

此时还在 B 控制器中,这些处理过程都是在 B 中处理的 , 也必须是 B 执行了 push 到 D 方法后,也就是说

[self.navigationController pushViewController:D animated:YES];

之后 进行的 数组处理;

附加代码:

在B 控制器中处理:

-(void)pushTest {    [self.navigationController pushViewController:D animated:YES];    NSMutableArray*tempMarr =[NSMutableArrayarrayWithArray:self.navigationController.viewControllers];    [tempMarr insertObject:C atIndex:tempMarr.count- 2];    [tempMarr removeObject:self]; //此时 的self 就是指 B ,因为在 B 中呢    [self.navigationController setViewControllers:tempMarr animated:YES];}

判断该界面是push得到还是present得到

NSArray *viewcontrollers=self.navigationController.viewControllers;    if (viewcontrollers.count>1) {        if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) {            //push方式        }    }    else{        //present方式    }

    或者


    //获取当前屏幕显示的viewcontroller

    - (UIViewController *)getCurrentVC

    {

        UIViewController *rootViewController = [UIApplicationsharedApplication].keyWindow.rootViewController;

        

        UIViewController *currentVC = [selfgetCurrentVCFrom:rootViewController];

        

        return currentVC;

    }


    - (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC

    {

        UIViewController *currentVC;

        

        if ([rootVCpresentedViewController]) {

            // 视图是被presented出来的

            

            rootVC = [rootVC presentedViewController];

        }

        

        if ([rootVCisKindOfClass:[UITabBarControllerclass]]) {

            // 根视图为UITabBarController

            

            currentVC = [selfgetCurrentVCFrom:[(UITabBarController *)rootVCselectedViewController]];

            

        } elseif ([rootVCisKindOfClass:[UINavigationControllerclass]]){

            // 根视图为UINavigationController

            

            currentVC = [selfgetCurrentVCFrom:[(UINavigationController *)rootVCvisibleViewController]];

            

        } else {

            // 根视图为非导航类

            

            currentVC = rootVC;

        }

        

        return currentVC;

    }



    阅读全文
    0 0
    原创粉丝点击