使用setViewControllers实现一些不同寻常的跳转

57 篇文章 0 订阅
44 篇文章 4 订阅
本文介绍了如何使用UINavigationController的setViewControllers方法来实现一些特殊的页面跳转效果,如在B页面返回时跳转到新页面C,避免A页面的闪现问题,以及在A页面跳转到B页面时直接添加C页面,确保数据传输不受影响。通过这种方法,可以更好地控制页面的堆栈管理,实现流畅的用户体验。
摘要由CSDN通过智能技术生成

相信大家对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页面.


原文地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值