今天 有人給我提出了一個這樣一個功能實現(xiàn)需求 : 假如有三個控制器 有 被同一個導航控制器所管理著 根控制器推到第二個 第二個推到第三個 導航欄自帶的返回按鈕是回到上一級界面 現(xiàn)在要求從第三個導航欄的barButton pop回到第一個也就是根視圖控制器
你肯定說這個問題非常簡單啊 直接自定義第三個控制器的導航欄的leftBarButton就行了唄 在其觸發(fā)方法里指定他
[self.navigationController popToRootViewControllerAnimated:YES]
但是事情遠遠沒那么簡單 iOS7.0之后 蘋果新推出的一個小功能 就是對于UINavagationController堆棧里的UIViewController,只要輕輕在視圖控制器的左邊緣右滑一下,該視圖控制器就會pop出棧(前提當然是對于非根視圖控制器而言)
現(xiàn)在的要求是不光是點擊導航欄的leftBarButton 能回到第一個界面
左側邊緣右滑也要回到第一個界面 而在你自定義完barButton之后 你會發(fā)現(xiàn)左側邊緣右滑 再怎么滑也滑不過去啦
這時候你可能會想那我再加一個手勢唄
這里先嘗試家里一個輕掃手勢
#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];
}
這樣寫完以后 果然實現(xiàn)了 從第三個界面的左側邊緣右滑 pop回到第一個界面
你可能會想 so easy 但是 大哥 可別高興地太早 來自汪星的某產品經(jīng)理又會說:"no no no 這跟我要的差遠了 你這只是突兀地一下跳到第一個界面了 而人家蘋果自帶的邊緣右滑 卻可以慢慢滑動 看到過程 " 于是乎 你不得不又投入到代碼中
實現(xiàn)的方式應該有很多 今天我教大家一種簡單易懂的方法 僅用幾行代碼就OK啦 根本不用添加手勢神馬的 既然第二個界面被推出來之后 退出第三個界面之后 暫時用不到了 而它又稱為界面一和界面三之間的一到屏障 我們不妨在界面二視圖小時之后 將它從
self.navigationController.viewControllers 中移除掉 這樣界面三再返回時 界面二已經(jīng)不在棧中 此時棧中只有界面一和界面三兩個控制器 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.itdecent.cn/p/ef58a80f6b78
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
現(xiàn)在再運行看看 是不是效果完美
