今天看产品需求,有一个很常见的需求,就是控制器乱七八糟跳转,根本不管你上层界面是怎么推出来的,所以整理一下,额.蛋疼的产品
假想一个需求,我在个人中心界面有一个申请退款功能,申请退款成功之后界面有一个回到首页的按钮,点击退出界面必须回到首页.
这种完全不遵循代码从哪入从哪出的逻辑习惯的跳转,实际开发中还是很常见的,抽空整理了一下,其实很简单
// 假设你想在三级页面点击控制器View跳转
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 因为你这个界面是一串推出来的,所以打印一下这个navigationController对应的所有控制器们,就能拿到这一串一共有多少控制器
// @property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers; // The current view controller stack.
// 上面不难看出,这个viewControllers是不可变数组,因为我们是要改变这个数组中控制器顺序的,所以先转成可变数组
NSMutableArray *tempMarr =[NSMutableArray arrayWithArray:self.navigationController.viewControllers];
NSLog(@"%zd",tempMarr.count);
// 去除你不想要跳转的控制器,注意顺序是0开始的
[tempMarr removeObjectAtIndex: 1];
// 这个方法也可以
// [tempMarr removeObject:self.navigationController.viewControllers[1]];
// 将已经剔除掉不想要的中间层的控制器数组设置给你的当前navigationController
[self.navigationController setViewControllers:tempMarr animated:YES];
这个时候实现pop的话就可以达到一串控制器内跨层级跳转了
// [self.navigationController popViewControllerAnimated:YES];
#pragma -mark 跨UITabbarController
// 如果你想跨UITabbarController跳转到别的item里面的话,下面代码就可以满足你
// 通过keyWindow拿到跟控制器,也就是UITabBarController
UITabBarController *tabViewController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
// 设置显示的状态
tabViewController.selectedIndex = 1;
// 推出即可
[self.navigationController popViewControllerAnimated:YES];
// 好了,完美
}
好了,把我的注释去掉,其实没几行代码
我见过丑逼代码,要跳转就去创建新的,导致看层级,压了一百层都不止,😭
再看咱的层级
干干净净
这只是个简单的例子,回到跟控制器直接poptorootViewController就行了,不要纠结这个,只是说这种写法~~~
好了,就这么多,欢迎大家观看