iOS - push 或 pop或点击导航栏返回pop指定导航控制器
以前一直有个很疑惑的问题没有搞清楚
关于ios中 viewcontroller的跳转问题,其中有一种方式是采用navigationController pushViewController 的方法,比如我从主页面跳转到了一级页面,又从一级页面跳转到了二级页面,然后从二级页面跳转到了三级页面,依次类推。,如果一级一级的返回我知道是没有问题的,调用navigationController popViewControllerAnimated就行了。。但是某些情况下我可能想要马上回到主页面,而不是一级一级的返回(如果有很多层会很累的),那该怎么办呢?
不是点击返回,点击指定btn返回到指定界面
1.返回根页面vc用 :
[self.navigationController popToRootViewController]
2.返回指定的某个vc用下面(通过index定位)
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];
if let index = self.navigationController?.viewControllers.index(of: self) {
self.navigationController?.viewControllers.remove(at: index)
}
3.(通过class定位),当前控制器有这个控制器存在
for (UIViewController *controller in self.navigationController.viewControllers) {
if ([controller isKindOfClass:[你要跳转到的Controller class]]) {
[self.navigationController popToViewController:controller animated:
YES];
}
}
重点 点击返回pop到指定控制器,当前控制器可能根本就没创建过,或者返回顺序和之前进来的顺序完全不一致,下面1代表根控制器
1.重构当行控制器
viewControllers顺序 :需注意一个事项,没有的vc(根本就不存在的vc,不是push的vc,)一定要重写下面的返回,因为Vc创建的时候根本不是push进来的,目前这个方法可以解决xib,sb,纯代码创建的VC
vc.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
1.1简单型 push顺序本来是 1234,返回顺序425631,需要在第3push第4时候,重构顺序
因为vc5, vc6 不存在 所以需要加上代码
vc5.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
let newViewController: [UIViewController] = [vc4 , vc2, vc5, vc4, vc3, vc2, vc1]
self?.navigationController?.setViewControllers(newViewController, animated: true)
1.2变态复杂性 push顺序123,返回顺序 341(在2push的地方重构viewControllers),但是在第3push到4的时候,返回顺序变了469231(在3push的地方再次重构顺序),第4push到第5的时候,返回变成了5283671(在4push的地方需要再次重构顺序)
在界面2需要重构 , 因为vc4 不存在 所以需要加上代码
vc4.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
let newViewController: [UIViewController] = [vc3 , vc4, vc1]
self?.navigationController?.setViewControllers(newViewController, animated: true)
在界面3需要重构 , 因为vc6,9 不存在 所以需要加上代码
vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
vc9.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
let newViewController: [UIViewController] = [vc4, vc6, vc9, vc2, vc3,vc1]
self?.navigationController?.setViewControllers(newViewController, animated: true)
1.3没有人性型, 和1.2一样,但是3这个界面有各个界面push进来,返回的时候多个界面需要重构。。。
例如:俩简单的,1根控制器,123->3961, 4532->23694
let controllers = self.navigationController.viewControllers for v in controllers{
//123->3691
if v is vc2(vc2是类名字), controllers.count == 2{
let vc6 = vc6()
vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
let vc9 = vc9()
vc9.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
let newViewController: [UIViewController] = [vc3, vc9, vc6, vc1]
self?.navigationController?.setViewControllers(newViewController, animated: true)
}else{
self?.navigationController?.setViewControllers(newViewController, animated: true)
} //4532->23694
if v is vc4(vc4是类名字),vc.count ==2{
let vc6 = vc6()
vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
let vc9 = vc9()
vc9.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
let newViewController: [UIViewController] = [vc4, vc9, vc6, vc3]
self?.navigationController?.setViewControllers(newViewController, animated: true)
}else{
self?.navigationController?.setViewControllers(newViewController, animated: true)
}
}
iOS - push 或 pop或点击导航栏返回pop指定导航控制器的更多相关文章
- Ios导航栏返回到指定的页面
在自己的项目实现中有这样的一个需求.一般情况下我们的导航栏返回按钮,是上个页面跳转过来,点击返回按钮返回到上来界面.但是在实际需求中有的并不是这么简单的.有的界面返回是只确定的界面.所以当时自己在实现 ...
- iOS 导航栏返回到指定页面的方法和理解
关于ios中 viewcontroller的跳转问题,其中有一种方式是采用navigationController pushViewController 的方法,比如我从主页面跳转到了一级页面,又从一 ...
- 转载 iOS拦截导航栏返回按钮事件的正确方式
原文链接:http://www.jianshu.com/p/25fd027916fa 当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮 ...
- iOS拦截导航栏返回按钮事件的正确方式
当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...
- iOS拦截导航栏返回按钮事件的正确方式(二)
当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...
- IOS 改变导航栏返回按钮的标题
IOS 改变导航栏返回按钮的标题 下午又找到了一个新的方法 这个方法不错 暂时没有发现异常的地方. 新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一 ...
- ios 修改导航栏返回按钮的图片
修改导航栏返回按钮的图片 方法1: [UINavigationBar appearance].backIndicatorTransitionMaskImage = [UIImage imageName ...
- ios开发之--iOS 11适配:iOS11导航栏返回偏移
UIBarButtonItem 左边间隙过大,解决方案(ios11之前): 调用下面的方法,设置negativeSpacer.width = -15;就可以解决间隙过大的问题: UIBarButton ...
- iOS侧滑返回到隐藏导航栏的VC,导航栏会闪现一次
VCA:是一个隐藏导航栏的页面:VCA在ViewWillAppear生命周期函数中设置导航栏隐藏: //隐藏导航栏 [self.navigationController setNavigationBa ...
随机推荐
- [UE4GamePlay架构(九)GameInstance(转)
GameInstance这个类可以跨关卡存在,它不会因为切换关卡或者切换游戏模式而被销毁.然而,GameMode和PlayController就会再切换关卡或者游戏模式时被引擎销毁重置,这样他们里面的 ...
- php实现socket
一.Socket 简介 1.socket只不过是一个数据结构. 2.使用这个socket数据结构去开始一个客户端和服务器之间的会话. 3.服务器是一直在监听准备产生一个新的会话.当一个客户端连接服务器 ...
- java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 对象DIY
1.在java开发中,好代码都是组织的比较好,模拟现实很好,而不是步骤指令 2.对象组织+继承(归类
- solr4.x之原子更新
solr4.x发布以后,最值得人关注的一个功能,就是原子更新功能,传说的solr是否能真正的做到像数据库一样,支持单列更新呢? 在solr官方的介绍中,原子更新是filed级别的更新,不会涉及整个Do ...
- Coxph model Pvalue Select
I am calculating cox propotional hazards models with the coxph function from the survival package. ...
- uva-784-水题-搜索
题意:从*点开始,标记所有能走到的点,X代表墙,下划线原样输出 AC:40ms #include<stdio.h> #include<iostream> #include< ...
- 0_Simple__MultiGPU
使用多台 GPU 进行计算 ▶ 源代码.使用不同的流来控制不同 GPU 上的运算任务. #include <stdio.h> #include <timer.h> #inclu ...
- jpa 一对一
实体 Manager package entity; import javax.persistence.Column; import javax.persistence.Entity; impor ...
- mavenLocal默认地址转移
maven的默认本地仓库为 USER_HOME/.m2/ windows开发我们大多不会讲本地仓库放在c盘下,而是重新指定了另一个存储位置. 在gradle中 使用 mavenLocal() 时的查找 ...