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];