StoryBoard是iOS 5的新特徵,旨在代替歷史悠久的NIB/XIB(其實StoryBoard仍是基於NIB/XIB的,不過開發人員已經無需直接跟NIB打交道了)。目前關於StoryBoard的文檔並很少,蘋果的iOS 5的開發者文檔裏也僅有很少的介紹。因此,本文只是簡單的談談本人對StoryBoard的一些粗淺的理解。(StoryBoard有時也叫作StoryBoarding,我不太注意這種細節,因此兩個詞常常會混用,若是你英語能夠的話,能體會到二者的細微差異)html
StoryBoarding機制比之NIB/XIB的的優點何在呢?我的認爲,StoryBoard有如下幾個優勢:設計模式
可以減小不少跟View相關的代碼;app
可以使View和Controller進一步解耦;ide
可以優化程序的「頁面流」,使程序的結構更清楚 ;優化
要理解這些優勢,咱們先要對NIB有一個基本的認識。一般,NIB是和ViewController相關聯的,不少ViewController都有對應的NIB文件。NIB文件的做用是描述用戶界面以及初始化對象和界面元素對象。其實開發者在NIB裏描述的界面和初始化的對象都可以在代碼中實現;之因此用Interface Builder來繪製界面,是爲了減小那些設置界面屬性的無聊和重複的代碼,讓開發人員可以集中精力作程序的功能。ui
而StoryBoard的出現,則是進一步增強了這方面的功能;NIB文件是沒有辦法描述從一個ViewController到另外一個ViewController的過渡的。這種過渡只能靠手寫代碼來實現。相信不少人都會常常用到
要用好Storyboarding機制,那麼必須嚴格遵照MVC原則。要讓View和Controller充分解耦;而且不一樣的Controller之間也要充分解耦。不然,程序的業務邏輯就會亂成一團,很難理解,維護和除蟲(Debug)。spa
舉個例子來講:在過去,特別是初學Cocoa Touch開發的時候,不少人都喜歡直接把AppDelegate當ViewController用,直接在AppDelegate和MainMenu.xib之間交互。應該說,這是一個很是很差的習慣。AppDelegate的做用很簡單,就是處理UIApplication的回調,而不該該負責用戶界面的處理。不少iOS教程爲了省事,都直接把AppDelegate當ViewController用,甚至直接舉例在UIWindow上繪製界面。雖然,做爲教程這麼作很簡單明瞭,由於UIWindow也是UIView的子類,可是這卻不是一種優良的實踐。由於由ViewController來負責處理View纔是正確的作法。設計
近一段時間,蘋果的項目模版常常發生改變,特別是自從Xcode 4發佈以後,程序模版(如,View Based Application)開始鼓勵使用UIWindow的rootViewController屬性來指定第一屏的ViewController,以保證AppDelegate專一於它應該作的事情。而引入StoryBoard以後,AppDelegate已經無論ViewController的事情了 ;第一屏所使用的ViewController(也就是rootViewController)能夠在StoryBoard中設置。這樣,程序的入口點就能從StoryBoard的「設計圖」上一目瞭然了。這是第二個優勢。3d
至於第三個優勢,就是StoryBoard的「設計圖」了。StoryBoard可以包含一個程序全部的ViewController以及它們之間的鏈接。所以,StoryBoard甚至能夠做爲程序的「設計圖」來用了。理想狀況下,在程序開發接近尾聲的時候,咱們只需對比StoryBoard的「流程」和最初程序的設計「流程」,就知道程序有沒有「走樣」了。
說完了優勢,咱們來看看從NIB/XIB到StoryBoard的遷移,咱們須要有哪些理解和實踐上的改變呢?
首先,天然是(在作程序開發的時候)ViewController再也不須要NIB/XIB了(雖然在後臺仍是用的NIB)。之前在NIB/XIB上作的鏈接Outlet和Action的操做均可以在StoryBoard上完成了;
第二,孤兒View(獨立於ViewController的View)是不能出如今StoryBoard裏的,View必須經過ViewController來管理(StoryBoard更像是Controller對象的容器,而不是View對象的容器,NIB/XIB能夠做爲View對象的容器);
第三,ViewController之間的過渡代碼已是歷史了,用StoryBoard能夠直接可視化地鏈接不一樣的ViewController;
第四,UIWindow對象的做用被進一步淡化,甚至能夠這麼說:其實不少程序根本無需用到UIWindow對象。AppDelegate也再也不被鼓勵(也不能)用來作ViewController--你甚至沒法在Interface Builder的StoryBoard圖上找到AppDelegate對象--由於它原本就不該該用來處理界面(View)的。
最後,寫優質的代碼,嚴格遵照MVC設計模式,這樣不只可以讓你用好StoryBoard,也能幫助你理解StoryBoard的原理。
StoryBoard是很是好的鼓勵MVC和代碼解耦的手段,可以讓開發人員寫出更加容易維護的代碼。不過對於初學者來講,確實是個對理解力的小挑戰。不過做爲初學者也不用擔憂,一旦突破了理解障礙,你就會發現StoryBoard也很是好用--就像最初理解NIB/XIB時,Outlet和Action「拉線」來「拉線」去,看起來也很神奇;理解以後,發現原來「拉線」神馬的也沒那麼神祕。
好了,絮絮不休的囉嗦了這麼多無聊的文字,相信你也看累了。若是你依然對我寫的東西不知所云的話,你能夠稍稍研究一下Xcode 4.2的幾個內建模版,而後和使用XIB的模版對比一下,看看蘋果是怎麼用StoryBoard的,可以很好的幫助你理解Storyboarding機制。固然,千萬不要忘記親自動手用一用StoryBoard!
Happy Coding!