今天 有人给我提出了一个这样一个功能实现需求 : 假如有三个控制器 有 被同一个导航控制器所管理着 根控制器推到第二个 第二个推到第三个 导航栏自带的返回按钮是回到上一级界面 现在要求从第三个导航栏的barButton pop回到第一个也就是根视图控制器
你肯定说这个问题非常简单啊 直接自定义第三个控制器的导航栏的leftBarButton就行了呗 在其触发方法里指定他
[self.navigationController popToRootViewControllerAnimated:YES]
但是事情远远没那么简单 iOS7.0之后 苹果新推出的一个小功能 就是对于UINavagationController堆栈里的UIViewController,只要轻轻在视图控制器的左边缘右滑一下,该视图控制器就会pop出栈(前提当然是对于非根视图控制器而言)
现在的要求是不光是点击导航栏的leftBarButton 能回到第一个界面
左侧边缘右滑也要回到第一个界面 而在你自定义完barButton之后 你会发现左侧边缘右滑 再怎么滑也滑不过去啦
这时候你可能会想那我再加一个手势呗
这里先尝试家里一个轻扫手势
#import "ThirdViewController.h"
@interface ThirdViewController ()
@end
- (void)viewDidLoad {
UISwipeGestureRecognizer *swiper = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swiperAction)];
swiper.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:swiper];
}
- (void)swiperAction
{
[self.navigationController popToRootViewControllerAnimated:YES];
}
这样写完以后 果然实现了 从第三个界面的左侧边缘右滑 pop回到第一个界面
你可能会想 so easy 但是 大哥 可别高兴地太早 来自汪星的某产品经理又会说:"no no no 这跟我要的差远了 你这只是突兀地一下跳到第一个界面了 而人家苹果自带的边缘右滑 却可以慢慢滑动 看到过程 " 于是乎 你不得不又投入到代码中
实现的方式应该有很多 今天我教大家一种简单易懂的方法 仅用几行代码就OK啦 根本不用添加手势神马的 既然第二个界面被推出来之后 退出第三个界面之后 暂时用不到了 而它又称为界面一和界面三之间的一到屏障 我们不妨在界面二视图小时之后 将它从
self.navigationController.viewControllers 中移除掉 这样界面三再返回时 界面二已经不在栈中 此时栈中只有界面一和界面三两个控制器 pop 完全无障碍
看代码
#import "SecondViewController.h"
#import "ThirdViewController.h"
@interface SecondViewController ()
@end
- (void)viewDidDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSMutableArray *vcArr = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[vcArr removeObject:self];
self.navigationController.viewControllers = vcArr;
}
如此这样便可 可是亲爱的们 别忘了 界面三的leftBarButton自定义之后 左侧边缘右滑的手势已不复存在 别着急 一行代码就可以解决这个问题 关于这个问题 我另一篇文章中有专门做解释 http://www.jianshu.com/p/ef58a80f6b78
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
现在再运行看看 是不是效果完美
屏幕快照 2016-05-20 21.19.29.png
网友评论