8、UIViewController們之間的協做——Segue

概述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

 

上一節           回目錄          下一節 

相關文章
相關標籤/搜索