你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 頁面的跳轉技巧

頁面的跳轉技巧

編輯:IOS開發基礎

img (190).jpg

相信大家對navigationController的跳轉都不陌生,UINavigationController是實現畫面多層次跳轉,並且可以自動地記憶跳轉所經過的路徑,按照這些記錄的路徑信息,可以依次返回到上層畫面中(即支持返回按鈕)。

Green 提供NavigationController頁面的跳轉技巧技術支持

我在開發中遇到這樣的需求,由A頁面跳轉到B頁面返回時要返回到之前沒有創建的C頁面。

一、關於跳轉

在使用UINavigationController時我們用的最多的就是Push和pop方法,而pop方法又包括popViewControllerAnimated、popToViewController與popToRootViewControllerAnimated,分別是返回上一層,返回指定層與返回根視圖(即UINavigationController最開始的那一層)
我們在運用這些跳轉時,每push一層都會將一個頁面保存到self.navigationController.viewControllers裡,相應的pop就是將頁面從self.navigationController.viewControllers移除的過程。

二、分析過程

開始我的做法很簡單,覺得在返回時pop掉B頁面

self.navigationController.popViewControllerAnimated(false)

然後push新頁面C

self.navigationController.pushViewController(C, animated: true)

這種看似合理的方法其實也有問題,就是即使pop時關閉了動畫,A頁面依然會閃現一下
於是我想到了新的思路,我們可以對self.navigationController.viewControllers進行操作,因為viewControllers: [UIViewController],就是一個數組。
我將這個數組取出對他進行操作,再賦值給他是不是也可以呢

var controllerArr = self.navigationController?.viewControllers
controllerArr?.insert(C, atIndex:controllerArr?.count-2)
self.navigationController?.viewControllers = controllerArr
self.navigationController?.popViewControllerAnimated(true)

效果完成了需求中的效果,但是發現B頁面依然在self.navigationController?.viewControllers中儲存的Controller中,導致數據在傳輸時數據會出現影響。後來當我看到setViewControllers這個方法時,突然覺得剛才那個就是個錯。

public func setViewControllers(viewControllers: [UIViewController], animated: Bool)
// If animated is YES, then simulate a push or pop depending on whether the new top view controller was previously in the stack.

即從iPhone OS 3.0以後,可以通過調用setViewController方法將畫面的跳轉歷史路徑(堆棧)完全替換,(這個才是正解)
那麼setViewController要怎麼用呢,看到網上還有不少人使用錯誤,下面舉兩個例子,可以參考

1. B頁面返回時跳轉新頁面C

跳轉1.png

var controllerArr = self.navigationController?.viewControllers//獲取Controller數組
controllerArr?.removeAll()//移除controllerArr中保存的歷史路徑
	//重新添加新的路徑
controllerArr?.append(self.navigationController?.viewControllers[0])
controllerArr?.append(C)
	//將組建好的新的跳轉路徑 set進self.navigationController裡
self.navigationController?.setViewControllers(controllerArr!, animated: true)//這裡直接setViewControllers即可,不需要push或者pop方法

2. A頁面跳轉到B頁面時,添加新頁面C

(即在B頁面加到navigationController裡之前修改頁面路徑)

跳轉2.png

var controllerArr = self.navigationController?.viewControllers//獲取Controller數組
controllerArr?.removeAll()//移除controllerArr中保存的歷史路徑
	//重新添加新的路徑
controllerArr?.append(self.navigationController?.viewControllers[0])
controllerArr?.append(C)
controllerArr?.append(B)
	//這時歷史路徑為(root -> c -> b)
	//將組建好的新的跳轉路徑 set進self.navigationController裡
self.navigationController?.setViewControllers(controllerArr!, animated: true)//直接寫入,完成跳轉B頁面的同時修改了之前的跳轉路徑

然後在B頁面裡就可以直接返回pop上一層,就是想要的C頁面。

小結

上面的兩種方法,分別對應B頁面需要對C頁面數據操作的和不需要對C頁面數據操作的兩種情況,針對setViewControllers方法我們還可以有更多的操作滿足各種奇葩的跳轉,希望本文可以給你一些幫助和提示。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved