iOSiOS假装进步

iOS 开发_多层被Present后,返回第一层或指定层

2019-02-27  本文已影响225人  iOS_PM_WEB_尛鹏

【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!

1.应用场景:

A---present---B---present---C---present---D,
如上结构为多级present的视图控制器之间的操作,
而一定情况下,我们需要返回到指定层

2.实现目标:

实现多级present的视图控制器之间,返回到任意指定视图层

3.代码说明:

1、利用递归,返回到第一层

这里需要理解一下presentingViewController/presentedViewController分别代表什么;如上应用场景时,则存在如下关系:

A.presentedViewController = B;
B.presentingViewController = A;
B.presentedViewController = C;
C.presentingViewController = B;

即:
presentedViewController是当前视图的present的下一层
presentingViewController是当前被present视图的上一层

  //lastVC当前视图的上一层
   UIViewController *lastVC = self.presentingViewController;
   while (lastVC.presentingViewController) 
{//一直找到最顶层
      lastVC = lastVC.presentingViewController;        
}
    [lastVC dismissViewControllerAnimated:YES completion:nil];
/**用实际用例说明一下:
假设当前self为D,则
lastVC为D的presentingViewController -->C;
执行第一次循环:lastVC为C的presentingViewController -->B;
执行第二次循环:lastVC为B的presentingViewControlle -->A;
第三层循环直接跳出...
最后通过presentingViewController找到了A,并执行了dismiss,返回了A
*/

!!!注意点!!! 以下两个方法效果相同!W H Y???

使用presentingViewController找出的视图,找出的是哪层在调用dismiss方法时就会调转到哪层的视图上

[B.presentingViewController dismissViewControllerAnimated:YES completion:nil];

[B dismissViewControllerAnimated:YES completion:nil];

#总结:利用上述的特性,即可完成如下扩展:⤵️

2、扩展1方法,加拦截判断,返回到指定层
   UIViewController *lastVC = self.presentingViewController;
   while (lastVC.presentingViewController) 
{
      lastVC = lastVC.presentingViewController;
      if ([lastVC isKindOfClass:[B class]]) {
            break;
        }     
}
    [lastVC dismissViewControllerAnimated:YES completion:nil];

上述结果自然是返回到了B控制器;

当然如果你记得清楚界面跳转的层次逻辑,也可以使用

D.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];

上一篇下一篇

猜你喜欢

热点阅读