天天看點

[IOS]關于segue原理機制的了解

因為接觸IOS比較晚,接觸的時候Xcode就已經有了storyboard這個東西,好處是在搞segue的時候可以省去很多手寫代碼,但是不好的就是會讓人不了解segue的具體運作機制和原理.經過網上查了各種資料,有了一點粗粗的了解,其中雖然有很多了解的還是比較模糊.大家看看,有哪裡不對,希望指出.

其實無論是何種segue(push,modal或是customer,更或者是後來新加的unwind),主要原理都是遵循如下幾個步驟:

1. 觸發segue事件

觸發segue有很多中方式,目前最常見的就是在storyboard上進行拉線,直接把某個button, control+拖曳至某個scene,這種方式我的了解是,當使用者點選該button的時候,UIkit會建立一個UIStoryboardSegue的對象(當然像unwind的segue方式在建立具體segue對象之前可能會先做各種事情,具體可見http://blog.csdn.net/nogodoss/article/details/41823195),同時會進行初始化該對象裡面一些具體資訊,比如sourceViewController的對象執行個體,targetViewController的對象執行個體,identifier的值(該值可以在storyboard上進行定義)等等.除了直接通過storyboard上進行觸發,當然也可以在代碼裡手動觸發,比如先将一個button的IBaction關聯到viewController上,然後在該IBaction方法中調用performSegueWithIdentifier:sender:來觸發,觸發之後,該方法實作的東西我估計應該和前面一種直接在storyboard上拉線觸發差不多.

2.觸發segue事件之後具體做的一些步驟

具體的一些動作可能依據不同的segue方式有所不同,但是無論是哪種segue,他們肯定會做如下幾個步驟,會調用sourceViewController對象的prepareForSegue:sender:方法,然後最終執行Segue執行個體中的perform方法來達到具體的切換.

下面針對其中幾個細節我具體說明下我的一些了解:

1. 關于Segue執行個體中的perform方法,根據我的了解,push或是modal或是customer或是unwind的不同正是因為這個方法的不同導緻(回憶一下如果你要用自己的customer的segue就一定得重寫perform方式的原因,可能就是因為這點);對于push的perform實作沒有具體研究過,但是估計也不會太難;對于modal的方式,應該其perform主要做的就是調用了sourceViewController對象的presentViewController:animated:completion:方法來達到;而對于unwind方式,因為unwind方式的前提是目前的sourceVIew是之前從别的view中segue過來的(關于這點我在第二點中會說明),是以他的perform實作就是調用sourceViewController對象的dismissViewControllerAnimated:completion:方法來達到隐藏目前的view,回到以前的view進而讓人感覺就是從目前的這個view直接segue到以前的那個view一樣了.

2.在第一點中我所說的unwind方式的前提是目前的sourceVIew是之前從别的view中segue過來的這是我實驗之後的猜測,首先我在storyboard上分别添加了3個viewController,分别定義為view1,view2,view3;然後分别在view1和view的controller中定義(IBAction)back1:(UIStoryboardSegue *)segue {}和(IBAction)back2:(UIStoryboardSegue *)segue {}兩個方法供unwind來連接配接,接着在view3中加兩個button分别unwind至back1和back2方法,然後将view3作為entryPoint,注意此時view1,view2和view3之間除了前面兩個unwind之後沒有任何segue的跳轉,此時我發現在模拟器中點選view3中的兩個button沒反應.然後我把entryPoint設定為view1,同時在view1中添加一個button,modal的方式跳轉到view3,此時再在view3上點選button1可以回到view1,但是點選button2還是沒反應,是以我才猜測要實作unwind的方式必須得在直接有建立過target的view,即目前的unwind的source VIew必須是從target VIew直接或者間接跳轉過來的.

以上純粹我個人看法,非常歡迎專業人士指出問題,這樣也就不會有人受誤導了.

繼續閱讀