在研發中總會遇到一些莫名的需求,本着存在即合理的態度跟你們分享一下"模態Model視圖跳轉和Push視圖跳轉的需求實現",本文僅僅傳授研發技術不傳授產品以及UE的思想,請你們合理對待;推薦乾貨:一鍵合成APP引導頁,包含不一樣狀態下的引導頁操做方式,同時支持動態圖片引導頁和靜態圖片引導頁以及視頻引導頁;GitHub地址: https://github.com/dingding3w/DHGuidePageHUD (多多Star,多多支持😊);git
(一)連續兩次模態Model視圖以後,而後返回首頁(A -> B -> C -> A)github
①效果圖展現:安全
②實現思想解讀:ide
一開始你們的思惟確定是一層一層的推出控制器,對這是最直接的辦法,可是Apple的工程師思惟非同凡響,其實你只須要解散一個Modal View Controller就能夠了;即處於最底層的View Controller,這樣處於這個層之上的ModalView Controller通通會被解散;那麼問題在於你如何獲取最底層的View Controller,若是是iOS4.0,你可使用parentViewController來得到當前Modal ViewController的「父View Controller」並解散本身;若是是iOS 5,你就得用presentingViewController了;學習
③核心代碼展現:ui
/** 在C頁面的DisMiss方法裏面添加一下代碼(iOS5.0) */
if ([self respondsToSelector:@selector(presentingViewController)]) { [self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES]; } else { [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES]; } /** 在C頁面的DisMiss方法裏面添加一下代碼(iOS6.0+) */
if ([self respondsToSelector:@selector(presentingViewController)]){ [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil]; } else { [self.parentViewController.parentViewController dismissViewControllerAnimated:YES completion:nil]; }
(二)在模態Model推出的視圖中Push下一個帶導航欄的視圖,而後返回首頁(A -> B ->C -> A)spa
①效果圖展現:3d
③實現思想解讀:代理
若是沒有UINavigationController導航欄頁面之間切換是不能實現Push操做的,那咱們平時見得無導航欄Push到下一頁是怎麼實現的呢? 如今跟你們分享一下實現原理, 就是在第一次Model出來的控制器提早包裝一個導航欄,並在Model出來控制器實現UINavigationController的代理方法,UINavigationControllerDelegate判斷當前Model出來的控制器是否爲自身控制器,這樣作的目的就是爲了更安全的隱藏該隱藏的控制器導航欄;雖然導航欄隱藏了,可是做爲導航欄的屬性仍是存在的,因此咱們如今就能夠不知不以爲在Model出來的控制器裏面Push出下一個頁面,並且下一個頁面仍是帶導航欄的,這樣Push出來的控制器,不只沒有消失原有的Pop功能操做,並且還能夠實現DisMiss操做;code
③核心代碼展現:
/** 這裏用到的核心處理辦法是 */
/** 1.在A控制器模態Model推出B控制器的時候先給B控制器包裝一個導航控制器 */ UINavigationController *ANavigationController = [[UINavigationController alloc] initWithRootViewController:[[BViewController alloc] init]]; [self presentViewController:ANavigationController animated:YES completion:nil]; /** 2.在B控制器遵照UINavigationControllerDelegate實現代理協議,隱藏當前控制器的導航欄 */
#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { // 判斷要顯示的控制器是不是自身控制器
BOOL isShowMyController = [viewController isKindOfClass:[self class]]; [self.navigationController setNavigationBarHidden:isShowMyController animated:YES]; } #pragma mark - Push出C控制器 [self.navigationController pushViewController:[[CViewController alloc] init] animated:YES]; /** 3.在C控制器裏面可直接在返回按鈕方法裏DisMiss */ [self.navigationController dismissViewControllerAnimated:YES completion:nil];
(三)相關相似問題會陸續添加,但願你們相互補充相互學習;