解释两个属性:
presentingViewControllerpresentedViewController

A----(present)-----B----(present)-----C

1、那么 A 就是 B 的 presentingViewController.
2、C 就是 B 的 presentedViewController.

以B为参照:A为presentingViewController, C为presentedViewController

如题,苹果自带的是没有直接dismissToRootViewController之类的方法,如果需要直接dismiss到最底层的那个控制器,可以自己写一个dismissToRootViewController方法,
代码如下:

说明:self调用dismiss方法会的时候会判断self.presentedViewController是否存在,如果存在,就只会将self.presentedViewController给dismiss掉,自己不会dismiss掉。所以我们一直遍历到最底层的控制器,然后调用dismiss方法,就会将所有的presentedViewController给dismiss掉。

presentedViewController 和 presentingViewController 以及 dismissViewControllerAnimated 的使用

在日常的开发中,多控制器之间的跳转除了使用push的方式,还可以使用 present的方式,present控制器时,就避免不了使用 presentedViewController、presentingViewController ,这两个概念容易混淆,简单介绍一下。

presentingViewController: 当前控制器是哪个控制器弹出的。由谁弹出。
presentedViewController: 当前控制器弹出的控制器。弹出了谁。

1:present 控制器的使用
  使用present的方式,从一个控制器跳转到另一个控制器的方法如下:

[self presentViewController:vc animated:YES completion:^{
         
}];

2:presentedViewController 与  presentingViewController
  假设从A控制器通过present的方式跳转到了B控制器,那么 A.presentedViewController 就是B控制器;B.presentingViewController 就是A控制器。

3:dismissViewControllerAnimated 方法的使用
  假设从A控制器通过present的方式跳转到了B控制器,现在想要回到A控制器,那么需要A控制器调用

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ __nullable)(void))completion
  方法。注意:是想要从B控制器回到A控制器时,需要A控制器调用上面的方法,而不是B控制器。简单来说,如果控制器通过present的方式跳转,想要回到哪个控制器,则需要哪个控制器调用 dismissViewControllerAnimated 方法。
举例来说,从A控制器跳转到B控制器,在B控制器中点击了返回按钮,期望能够回到A控制器,则B控制器中点击返回按钮触发事件的代码是:
[self.presentingViewController dismissViewControllerAnimated:YES completion:^{
         
}];
注意:这段代码是在B中执行,因此 self.presentingViewController 实际上就是A控制器,这样就返回到了A控制器。
如果多个控制器都通过 present 的方式跳转呢?比如从A跳转到B,从B跳转到C,从C跳转到D,如何由D直接返回到A呢?可以通过 presentingViewController 一直找到A控制器,然后调用A控制器的 dismissViewControllerAnimated 方法。方法如下:
UIViewController *controller = self;
while(controller.presentingViewController != nil){
    controller = controller.presentingViewController;
}
[controller dismissViewControllerAnimated:YES completion:nil];

PS:如果不是想直接返回到A控制器,比如想回到B控制器,while循环的终止条件可以通过控制器的类来判断。

最新文章

  1. 【摘】Mysql备份还原数据库之mysqldump实例及参数详细说明
  2. Linux之Shell的算术运算
  3. YII Framework学习教程-YII的异常处理
  4. SQLite入门与分析(七)---浅谈SQLite的虚拟机
  5. jquery判断客户端的类型
  6. vue中实现动态切换不同的值
  7. 用 Mathematica 获取图片的 RGB 三基色
  8. objectarx 读取外部DWG图到当前图形
  9. Delphi indy线程控件TIdThreadComponent的使用
  10. 利用js 生成不同li标签的点击事件
  11. php5.6安装redis各个版本地址集合
  12. spring security学习
  13. Sort功能极强!
  14. 移植BOA服务器到开发板
  15. 【LeetCode每天一题】Merge Two Sorted Lists(合并两个排序链表)
  16. Java Nashorn--Part 5
  17. 文字描边css
  18. robotframework安装与配置--学习第一天
  19. Linux服务器安装JDK运行环境教程
  20. thinkphp5中Indirect modification of overloaded element of XXX has no effect的解决办法

热门文章

  1. java四种引用类型以及使用场景详解
  2. thinkphp数据库连接
  3. SpringMVC的@ResponseBody注解简介
  4. python高级:垃圾回收机制
  5. Java初步
  6. 详解zabbix中文版安装部署
  7. VUE的系统指令
  8. 英语单词omitting
  9. centos6.5安装nginx1.16.0
  10. linux常用基本命令 grep awk 待优化