概述html
正所謂「一輩子二,二生三,三生萬物」,1個UIViewController沒什麼花樣,多個UIViewController相互協做就有了各式各樣豐富多彩的APP。可是UIViewController們自成一體互不認識,成天就只知道在本身的界面裏碼代碼,該怎麼讓他們配對成功呢?這時候就須要咱們的介紹人——Segue——登場了。首先咱們會介紹UIViewController是如何經過Segue暗送秋波,Segue共分爲5類:show,show detail,present modally,present as popover和custom(另有push和modally兩類,因被xcode棄用,因此此處不表)。xcode
傳遞參數函數
如今咱們要再建立1個UIViewController,而且讓初始UIViewController能夠傳遞1個字符串到第2個UIViewController。動畫
首先,建立1個新工程,而後在Main.storyboard上再拖入1個UIViewController。spa
而後再建立1個UIViewController所對應的類文件,咱們將其命名爲SecondViewController。3d
而後咱們將SecondViewController和Storyboard上的UIViewController關聯起來:選中第2個UIViewController,將其Class屬性設置爲SecondViewController。代理
「control-拖拽」初始UIViewController的「銅錢狀」圖標到第2個UIViewController上,並選擇「Show」。code
因而咱們建立了咱們的第1個Segue,就是在兩個UIViewController面板之間那條帶箭頭的線。那咱們如何在代碼中引用這個Segue呢?Segue不像Label或者button,它是沒法經過「controller-拖拽」的方式來引用的,可是能夠經過索引Segue的Identifier來引用Segue。在Storyboard上選中Segue那條線,而後修改「Identifier屬性」爲「MySegue」。orm
接着,咱們在第一個UIViewController添加1個觸發Segue的Button,併爲其添加觸發Segue的代碼,其中performSegue的參數「withIdentifier」用於肯定segue的Identifier,從而肯定觸發哪個Segue。htm
到目前爲止,Segue確實能夠觸發了,可是兩個UIViewController之間尚未產生數據交互。
咱們先加入1個內嵌的導航欄,並命名其標題爲SegueTest
咱們在SecondViewController中添加1個字符串做爲其導航欄的標題。
如今咱們要在觸發Segue時,向SecondViewController中傳入1個字符串做爲其導航欄的title。
大功告成。
Segue的類型
開頭咱們就介紹了,segue有show,show detail,present modally,present as popover和custom共5種類型,那它們之間有什麼區別呢?
在剛剛的例子中,咱們發如今觸發Segue進入SecondViewController後,導航欄自動添加了1個回退鍵(內嵌導航欄真貼心~)
這就是「show segue」的特色:在進入新的UIViewController時,新的UIViewController會保留前一個UIViewController的內嵌導航欄,而且提供返回按鍵。
那若是我把「show segue」換成「show detail segue」呢?
咱們再新建1個工程,基本複製前一個例子,惟獨把「show segue」換成「show detail segue」。咱們來看看效果:
千萬不要說:「竟然沒有效果?!」
由於效果很明顯:導航欄沒了!
這就是「show detail segue」的特色:在進入新的UIViewController時,新的UIViewController不在使用前一個UIViewController的內嵌導航欄,更不會提供返回鍵。
因而咱們給SecondViewController單獨添加導航欄:選中SecondViewController的面板再依次選擇Editor->Embeded in->Navigation Controller。
這時須要注意,「MySegue」的關係改變了,它再也不是「ViewController->SecondViewController」的關係,而是「ViewController->SecondViewController的導航欄」的關係。因此咱們要作以下代碼修改,不然運行會崩潰。
同時再添加1個返回按鍵
這時有個問題,那就是ViewController沒法將數據直接交給SecondViewController,而是必須將數據先交給SecondViewController的NavigationController,咱們能夠從新定義1個SecondNavigationController並繼承UINavigationController,而後將SecondViewController的NavigationController的class設置成SecondNavigationController。咱們在SecondNavigationController中預設咱們想要傳遞的數據,ViewController將數據傳遞給SecondNavigationController後SecondViewController就能夠經過navigationController成員變量獲取數據,此處再也不舉例。
「present modally」的特色:和「show detail」基本相同,可是多一些動畫效果。
「present as popover」的特色:經常使用於菜單彈框。
老樣子,第一步先Control拖拽1個Segue,並選擇Segue as popover。
咱們在第2個UIViewController添加2個按鈕「唧唧」和「喳喳」。而後選中Segue,設置其「Identifier」爲「MySegue」,將「Anchor」拖拽到第1個UIViewController上的Button上。
修改UIViewController的代碼,添加「UIPopoverPresentationControllerDelegate」代理,並重寫「adaptivePresentationStyle」函數,並在prepare中將代理設置給Segue,同時添加第1個UIViewController中按鈕的事件觸發代碼(actionTriggerSegue)
看看效果:感受彈框略大了些,並且還把Button給遮住了。
選中第2個ViewController,並設置其「Content Size」。
Xcode上的模擬效果彷佛沒什麼變化。咱們再修改模擬的大小,這樣彈框的尺寸就變小了。
而後咱們要但願彈框不要遮住「Button」,因而咱們讓「Button」位於彈框右側。
若是你還想要一些更炫酷的過場動畫,那麼你可使用「Custom」Segue。
「Custom」的特色:多用於自定義過場動畫。
首先,自定義1個Segue,咱們此處命名其爲「CustomSegue」
重寫「perform」函數,其中srcView和dstView分別爲Segue切換時,切換前的ViewController和切換後的ViewController,咱們爲dstView添加3種動畫:
旋轉動畫、X軸放大動畫和Y軸放大動畫。
Control拖拽Segue,使用Custom類型,而後設置「Identifier」爲「MySegue」,並將Class設置爲「CustomSegue」
最後別忘記給按鈕添加觸發Segue的事件
源碼下載(Show Segue):https://pan.baidu.com/s/1qTugv5cWriVg4kx5vZTxHg
源碼下載(Show Detail Segue):https://pan.baidu.com/s/1rL2J_uxe4xMJcJatbG-niA
源碼下載(Present Modally Segue):https://pan.baidu.com/s/1qemWf7n9vfSgLz0v6d6HNA
源碼下載(Present as popover Segue):https://pan.baidu.com/s/1DzpXJnLPmHlfvTNqTiJYlg
源碼下載(Custom Segue):https://pan.baidu.com/s/1E7A__CamnJz-BFhhlS_tZg