相信大家对navigationController的跳转都不陌生,还记得微信里面联系人详细资料里面的发消息按钮点击后的效果和切换语言后的效果吗,UINavigationController是实现画面多层次跳转,并且可以自动地记忆跳转所经过的路径,按照这些记录的路径信息,可以依次返回到上层画面中.


基本跳转:

在使用UINavigationController时我们用的最多的就是Pushpop方法,而pop方法又包括popViewControllerAnimatedpopToViewControllerpopToRootViewControllerAnimated,分别是返回上一层,返回指定层与返回根视图(即UINavigationController最开始的那一层)

我们在运用这些跳转时,每push一层都会将一个页面保存到self.navigationController.viewControllers里,相应的pop就是将页面从self.navigationController.viewControllers移除的过程.

实现一个需求:pop掉当前的界面同时push出一个新的界面:

过程分析:

开始做法很简单,在返回时pop掉B页面即可

self.navigationController.popViewControllerAnimated(false)

然后push新页面C

self.navigationController.pushViewController(C, animated: true)

这种看似合理的方法其实也有问题,就是即使pop时关闭了动画,A页面依然会闪现一下,于是想到了新的思路,对self.navigationController.viewControllers进行操作,因为viewControllers: [UIViewController],就是一个数组.将这个数组取出对他进行操作,再赋值

var controllerArr = self.navigationController?.viewControllers
controllerArr?.insert(C, atIndex:controllerArr?.count-2)
self.navigationController?.viewControllers = controllerArr
self.navigationController?.popViewControllerAnimated(true)

效果完成了需求中的效果,但是发现B页面依然在self.navigationController?.viewControllers中储存的Controller中,导致数据在传输时数据会出现影响.后来当看到setViewControllers这个方法时,突然觉得刚才那个就是个错.

public func setViewControllers(viewControllers: [UIViewController], animated: Bool)
// If animated is YES, then simulate a push or pop depending on whether the new top view controller was previously in the stack.

即从iPhone OS 3.0以后,可以通过调用setViewController方法将画面的跳转历史路径(堆栈)完全替换,(这个才是正解)

B页面返回时跳转新页面C

var controllerArr = self.navigationController?.viewControllers//获取Controller数组
controllerArr?.removeAll()//移除controllerArr中保存的历史路径
//重新添加新的路径
controllerArr?.append(self.navigationController?.viewControllers[0])
controllerArr?.append(C)
//将组建好的新的跳转路径 set进self.navigationController里
self.navigationController?.setViewControllers(controllerArr!, animated: true)//这里直接setViewControllers即可,不需要push或者pop方法

A页面跳转到B页面时,添加新页面C

即在B页面加到navigationController里之前修改页面路径

var controllerArr = self.navigationController?.viewControllers//获取Controller数组
controllerArr?.removeAll()//移除controllerArr中保存的历史路径
//重新添加新的路径
controllerArr?.append(self.navigationController?.viewControllers[0])
controllerArr?.append(C)
controllerArr?.append(B)
//这时历史路径为(root -> c -> b)
//将组建好的新的跳转路径 set进self.navigationController里
self.navigationController?.setViewControllers(controllerArr!, animated: true)//直接写入,完成跳转B页面的同时修改了之前的跳转路径

然后在B页面里就可以直接返回pop上一层,就是想要的C页面.


原文地址

使用setViewControllers实现一些不同寻常的跳转相关推荐

  1. Spring MVC 如何上传多个文件到指定位置

    Spring MVC 如何上传多个文件到指定位置 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...

  2. 2020安徽省大学生程序设计大赛题解——F 跳蛙出行

    2020安徽省大学生程序设计大赛题解--F 跳蛙出行 F 跳蛙出行 池塘里有n片荷叶排成一行,有一只青蛙在上面跳跃.但是,这只青蛙是只不同寻常的青蛙,它每跳一次,只能从一片荷叶跳到相邻的荷叶上,并且, ...

  3. 页面不同navi的跳转

    1. B页面返回时跳转新页面C var controllerArr = self.navigationController?.viewControllers//获取Controller数组 contr ...

  4. 自制青蛙跳台阶小游戏~

    青蛙跳台阶小游戏 1.概念(concept)文档 楔子(Setting):千百年来,人们在贬低别人时,常用井底之蛙来描述那个人,但这却让青蛙不开心了,于是青蛙决定跳出井底,为自己讨一个公道. 玩法(G ...

  5. [递归]一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

    这题是用C写的~ 在牛客上半天找不着ACM模式,练习模式里只有核心代码模式 这样用C语言编译器就不能自定义函数啊,不鸡肋吗??? 解决方法:在核心代码模式下用C++编译器(反正C++完全兼容C的不是吗 ...

  6. 在React Hook里使用history.push跳转

    在React Hook里使用history.push跳转 react hook里用不了this.props.history的解决方法 首先引入 import { useHistory } from ' ...

  7. php连接mysql页面空白_求大神: php注册页面跳转出现空白页

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 register.php: 我感觉是不是insert这个地方出现问题,我试图填写不一样的密码但是他并没有提示错误而是跳转空白页 session_start ...

  8. HarmonyOS 界面跳转以及界面跳转的同时传递参数

    HarmonyOS 不带参数界面之间跳转 package com.example.myapplication.slice; import com.example.myapplication.Resou ...

  9. Android 隐式跳转(Activity的隐式跳转)

    学而时习之,温故而知新,放假前回顾下android 的 隐式跳转 Activity的显式跳转: 是直接指定需要调用的Activity Activity的隐式跳转: 不明确指定启动哪个Activity, ...

最新文章

  1. Java常见异常及解释
  2. 7-Zip CommondLine 使用记录
  3. C#中的Explicit和Implicit了解一下吧
  4. 火狐浏览器摄像头权限怎么开启 火狐浏览器摄像头权限开启的方法
  5. 台达伺服电机选型手册_机械加工工艺师手册_打包下载
  6. Qt工作笔记-QStylePlugin插件实现变化窗体背景
  7. HashMap源码及原理
  8. 谷歌浏览器怎么网页截图
  9. 整理struct sockaddr和struct sockaddr_in
  10. pytorch迁移学习后使用微调策略再次提高模型训练结果
  11. 阿里巴巴开源AI技术:强化学习在阿里的技术演进与业务创新
  12. 删除CentOS系统自带的jdk
  13. DEDECMS安装遇到NO input files specified解决方案
  14. 申请德国农工大学计算机案例,德州农工大学本科案例
  15. 离线学校计算机协会工作计划,计算机协会(社团)各月工作总结及工作计划.docx...
  16. html让底部文字居中,网站底部版权居中-html css怎么让文字在页面底部居中
  17. mysql join 性能测试_Mysql Join语法解析与性能分析
  18. 迅雷推阅读产品 市场容不下生力军
  19. Conditional ternary operator...
  20. 无法识别服务器硬件信息,请教:无法获取服务器硬件信息

热门文章

  1. 常见的数字高程模型结构有哪些?
  2. 全国高精度数字高程模型 精度为5m的dem
  3. 线程和进程(1)——多线程,进程与线程
  4. 工业机器人编程调试怎么学
  5. 云服务器和VPS有什么区别?
  6. Python中的列表遍历
  7. docker 容器Exited【数字报错】问题
  8. Linux重启后硬盘挂载失效问题解决
  9. 神经网络聚类方法:SOM算法原理
  10. 联想拯救者isk15安装固态硬盘记录