WWDC之What's New in Storyboards

前言

我記得一開始接觸iOS6時(shí)Storyboard技術(shù)在Xcode4上才剛剛露出頭角,而學(xué)習(xí)和使用過程中卻往往與Xib技術(shù)相混淆,不過由于Storyboard大大簡(jiǎn)化了App開發(fā)的難度,能夠簡(jiǎn)單快速地搭建界面,當(dāng)初就用了Storyboard來(lái)做自己項(xiàng)目的主要界面.現(xiàn)在經(jīng)過Xcode的不斷迭代和功能完善,Storyboard技術(shù)在Xcode上也日益強(qiáng)大,也被蘋果官方推崇使用,多數(shù)WWDC的代碼都有Storyboard的身影.而這部Session主要講I了iOS9之后所出現(xiàn)的新Storyboard技術(shù):

內(nèi)容

Storyboard Reference

官方介紹

  • 用來(lái)表示另個(gè)Scene,并讓Scene能存在于不同的Storyboard文件中;
  • 用來(lái)指示某segue所關(guān)聯(lián)或觸發(fā)的目標(biāo)Scene.
  • 能使用在同一個(gè)或者不同的Storyboard中.

如何使用
A.自動(dòng)創(chuàng)建Reference

  1. 將需要單獨(dú)移動(dòng)到一個(gè)Storyboard文件的所有視圖控制器相關(guān)的Scene選中,
  2. 選擇Xcode頂部工具欄的Editor選項(xiàng),選中最后一個(gè)Refactor to Storyboard...
    Refactor to Storyboard
  3. 輸入新建的Storyboard名字即可.

B.手動(dòng)創(chuàng)建Reference

  1. 新建一個(gè)Storyboard文件并命名,并且設(shè)置該視圖控制器的層次結(jié)構(gòu)
  2. 在主Storyboard中從UI控件庫(kù)拖入Storyboard Reference控件,選中該控件在其屬性設(shè)置欄填入該Reference所代表的Storyboard文件名和加載時(shí)指定的控制器,默認(rèn)為Initial View Controller
    Setting Reference
  3. 在主Storyboard中將該Reference與其他控制器進(jìn)行層次關(guān)聯(lián).

創(chuàng)建和配置好之后,所有UI配置和操作就可以在各自的Storyboard文件中進(jìn)行,各個(gè)界面直接互補(bǔ)影響,這樣一來(lái),對(duì)于在代碼控制下的項(xiàng)目中對(duì)各自Storyboard進(jìn)行UI設(shè)置也不會(huì)造成很多煩人的合并沖突.

Tip: 雙擊配置好的Storyboard Reference,可以快速跳轉(zhuǎn)到其所代表的Storyboard文件中的指定Scene.

自定義標(biāo)準(zhǔn)的 Segue

Segue就是在Storyboard中設(shè)置控制器關(guān)聯(lián)時(shí)需要使用的東西,它是一個(gè)UIStoryboardSegue對(duì)象,在iOS8時(shí)如果需要自定義Segue進(jìn)行特別的轉(zhuǎn)場(chǎng)動(dòng)畫時(shí)就需要在Segue屬性欄的類型選為Custom,然后創(chuàng)建一個(gè)自定義的UIStoryboardSegue對(duì)象,并在屬性欄相關(guān)聯(lián).而現(xiàn)在iOS9下允許在默認(rèn)類型的Segue還可以指定其所屬的類,這樣可以在類中perform方法除了能實(shí)現(xiàn)自定義轉(zhuǎn)場(chǎng)動(dòng)畫,最后調(diào)用super.perform.若Segue類未設(shè)置自定義轉(zhuǎn)場(chǎng)效果,則super方法會(huì)執(zhí)行所默認(rèn)類型的轉(zhuǎn)場(chǎng)效果.

讓自定義Segue實(shí)現(xiàn)定制的轉(zhuǎn)場(chǎng)動(dòng)畫
在segue中實(shí)現(xiàn)自定義轉(zhuǎn)場(chǎng)動(dòng)畫需要利用destinationViewController屬性設(shè)置目標(biāo)轉(zhuǎn)場(chǎng)代理對(duì)象為當(dāng)前Segue,實(shí)現(xiàn)其代理的方法,并指定一個(gè)控制轉(zhuǎn)場(chǎng)的動(dòng)畫對(duì)象.(這里就要用到iOS7所推出自定義轉(zhuǎn)場(chǎng)動(dòng)畫相關(guān)API,具體方式將在以后的Session文章說明)

Note: 用于Present Modally的Segue對(duì)象在Present動(dòng)作后會(huì)被系統(tǒng)retain,延遲它的生命周期,等待需要Dismiss動(dòng)作時(shí)才會(huì)被釋放.

自定義Segue步驟

  1. 創(chuàng)建Storyboard Segue子類
  2. 重寫perform方法,為segue相關(guān)聯(lián)的控制器設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫代理為當(dāng)前segue,若是push/pop動(dòng)畫則設(shè)置navigationDelegate對(duì)象為當(dāng)前segue,實(shí)現(xiàn)動(dòng)畫代理方法.
  3. 在Storyboard中的Segue指定其寫好轉(zhuǎn)場(chǎng)動(dòng)畫的子類.

Unwind Segue

Unwind Segue使用時(shí)機(jī)主要是在兩個(gè)控制器在沒有普通Segue連接并且兩者之間有復(fù)雜層次關(guān)系下,需要進(jìn)行指定跳轉(zhuǎn)時(shí),以及Present Modal之后想回到源控制器的時(shí)候.

內(nèi)部定位目標(biāo)控制器
根據(jù)Session介紹說明,首先會(huì)在當(dāng)前控制器中調(diào)用allowedChildViewControllersForUnwindingFromSource獲得其所有子視圖控制器數(shù)組用來(lái)搜索Unwind Segue所在位置控制器的,然后調(diào)用childViewControllerContainingSegueSource返回與Unwind Segue關(guān)聯(lián)的目標(biāo)控制器對(duì)象,最后執(zhí)行canPerformUnwindSegueAction方法查詢是否能夠執(zhí)行該Action.整個(gè)過程中目標(biāo)控制器的搜索層次為先對(duì)自己子控制器進(jìn)行查詢,然后對(duì)自己,然后向上搜索,對(duì)父控制器進(jìn)行查詢,最后由父控制器向其他子控制器進(jìn)行查詢,以allowedChildViewControllersForUnwindingFromSource方法獲得的控制器數(shù)組進(jìn)行順序查詢,直至找到真正Unwind Segue所在的控制器.

使用方法

  1. 首先需要在目的控制器中添加一個(gè)IBAction方法,并且參數(shù)必須為一個(gè)UIStoryboardSegue對(duì)象.這樣能為Storyboard識(shí)別為Unwind Segue對(duì)象的動(dòng)作方法.就像做了標(biāo)記指定了要回到的控制器.
@IBACtion func unwindForDismiss(segue: UIStoryboardSegue){
    //... empty
}
  1. 在Storyboard找到的源控制器Scene DocExit按鈕,將原先定義的IBAction方法直接與要進(jìn)行跳轉(zhuǎn)操作的控件進(jìn)行關(guān)聯(lián).
    Unwind Segue Action

結(jié)尾

結(jié)合視頻和Demo的演示很全面地展示了Storyboard在iOS9的新特性,使用起來(lái)也是十分簡(jiǎn)單,但感覺自己在技術(shù)上的表達(dá)還是有所欠缺,可能無(wú)法全面透徹地表述某個(gè)地方內(nèi)部原理實(shí)現(xiàn),還是需要多多鍛煉自己的思考總結(jié)和表達(dá)能力.如果哪有不對(duì)的地方,感謝過來(lái)拍磚和交流~??????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容