[绍棠] iOS 各个界面相互push 以及 如何判断当前页面是push进入还是present进入
来源:互联网 发布:淘宝的淘金币在哪里 编辑:程序博客网 时间:2024/05/18 04:54
想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop 的A
解决方法如下:
1.假如此时在 A 控制器下,想要到 push 到 B, 可以这样写
[self.navigationController pushViewController: B :YES];
这时 self.navigationController.viewControllers 中按顺序含有 [A,B]
2.此时已经到 B 控制器下了, 接下来是 push 到 D, 可以这样写
[self.navigationController pushViewController: D :YES];
这时 self.navigationController.viewControllers 中按顺序含有 [A,B,D]
接下来很重要,很重要,很重要:
如何想从 D pop 到 C, 看数组[A,B,D] 中压根就没有C 该如何pop 到C呢?
这时就需要对这个数组进行修改,将C 加入进去
于是 你会如下写:
[self.navigationController.viewControllers addObject:C];
发现报错,这是因为self.navigationController.viewControllers
是不可变数组,没办法了,我们只好转换一下了:
NSMutableArray*tempMarr =[NSMutableArrayarrayWithArray:self.navigationController.viewControllers];
此时再加入C 就容易多了,咦,聪明的你会发现从 D pop C 不能直接将 C直接 addObject;
当然,我会这样做:
[tempMarr insertObject:C atIndex:tempMarr.count- 2];
这时候 tempMarr 是这样的 [A,B,C,D], 可是 要想 从 C pop 到 A ,数组中就不能有 B
就需要 将tempMarr 变成 [A,C,D] ,至于怎么变,你比我懂得多,
懂得思考的同学会发现 这时的self.navigationController.viewControllers 依然是 [A,B,D], 不用急,不用怕navigationController 有这样一个方法, 可以搞定,如下:
[self.navigationController setViewControllers:tempMarr animated:YES];
有的同学会说,这不是直接把 B 替换 成 C 吗
看上去是这样,可是跳转的时机,时机,时机重要的事情说三遍,还有视图的切换,切换,切换
此时还在 B 控制器中,这些处理过程都是在 B 中处理的 , 也必须是 B 执行了 push 到 D 方法后,也就是说
[self.navigationController pushViewController:D animated:YES];
之后 进行的 数组处理;
附加代码:
在B 控制器中处理:
-(void)pushTest { [self.navigationController pushViewController:D animated:YES]; NSMutableArray*tempMarr =[NSMutableArrayarrayWithArray:self.navigationController.viewControllers]; [tempMarr insertObject:C atIndex:tempMarr.count- 2]; [tempMarr removeObject:self]; //此时 的self 就是指 B ,因为在 B 中呢 [self.navigationController setViewControllers:tempMarr animated:YES];}
判断该界面是push得到还是present得到
或者
//获取当前屏幕显示的viewcontroller
- (UIViewController *)getCurrentVC
{
UIViewController *rootViewController = [UIApplicationsharedApplication].keyWindow.rootViewController;
UIViewController *currentVC = [selfgetCurrentVCFrom:rootViewController];
return currentVC;
}
- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
{
UIViewController *currentVC;
if ([rootVCpresentedViewController]) {
// 视图是被presented出来的
rootVC = [rootVC presentedViewController];
}
if ([rootVCisKindOfClass:[UITabBarControllerclass]]) {
// 根视图为UITabBarController
currentVC = [selfgetCurrentVCFrom:[(UITabBarController *)rootVCselectedViewController]];
} elseif ([rootVCisKindOfClass:[UINavigationControllerclass]]){
// 根视图为UINavigationController
currentVC = [selfgetCurrentVCFrom:[(UINavigationController *)rootVCvisibleViewController]];
} else {
// 根视图为非导航类
currentVC = rootVC;
}
return currentVC;
}
- [绍棠] iOS 各个界面相互push 以及 如何判断当前页面是push进入还是present进入
- iOS 如何判断当前页面是push进入还是present进入
- iOS开发怎么判断当前页面是push方式进入还是present方式进入
- iOS开发怎么判断当前页面是push方式进入还是present方式进入
- iOS开发怎么判断当前页面是push方式进入还是present方式进入
- iOS 判断当前viewcontroller是push还是present的方式显示
- ios开发 判断当前ViewController是push还是present的方式显示的
- 判断当前viewcontroller是push还是present的方式显示的
- 判断当前viewcontroller是push还是present的方式显示的
- 判断当前视图操作是push还是pop
- 如何判断是自己进入app还是浏览者进入app
- Objective-C页面消失或出现时,判断是pop还是push操作
- 如何判断用户是否为第一次进入app或者是第一次进入指定页面
- 如何判断当前移动设备是IOS还是安卓
- asp如何判断进入网站的客户是手机还是pc
- ios开发:push与present的区别
- 判断当前页面是刷新还是关闭
- android如何从应用程序进入设置的各个页面
- 智能制造信息化系统·详解
- Android视频进阶之旅(一)_概念介绍
- 删除当前目录下指定文件或者文件夹的批处理
- Java高并发处理
- 比特币客户端使用的数据库levelDB介绍
- [绍棠] iOS 各个界面相互push 以及 如何判断当前页面是push进入还是present进入
- Androidstudio切换java与C++代码调试
- Win10下loadRunner安装及运行问题解决——在安装时提示被管理员禁止解决办法
- oracle获取Date类型字段无时分秒Data和Timestamp比较
- 小白入门C++ 继承 多态 函数重载
- Httpclient https请求出现Certificates does not conform 解决方法
- VTK基础
- linux下tomcat8的安装
- Hexo+GitHub搭建自己的博客