XCode 4.2 新功能 - Storyboard

轉載:http://blog.sina.com.cn/s/blog_61f4999d0100x0el.html

 

XCode4.2 新功能 - Storyboard

最近開始比較有空在玩 XCode 4.2(iOS5 Beta3),赫然發現它多了個 Storyboard 的東東。
Storyboard 這個東西一般來說是在做創意發想的時候,用來將自己的想的一些故事情節畫成像是連環漫畫一樣,想不到 Apple把它用在這裡,真是佩服...

好吧,不廢話,先來說說這個 Storyboard 帶來什麼改變?

在這個版本前,我們在設計畫面的時候都是用 interface builder 產生一個 xib 檔,然後在 code要出現這個畫面的時候可能是用這樣的方式:

[self.navigationController pushViewController:viewControlleranimated:YES];

好,也許大家(包括我)已經習慣這樣的方式了,不過如果畫面一多的話,到處 push 來 pop 去的,誰知道畫面之間是怎麼串呢?可能只有PG 最清楚吧?

現在 Storyboard 解決了這樣的問題,讓你先將故事情節畫出來,像這樣

[attach]3682[/attach]

畫面中間那個像是轉接頭的叫做 Segue,先把你要的畫面(View controller)拉到 Storyboard內之後,比方說要將 A畫面->B畫面,那麼在 A 上面按住 control 鍵,然後拉到 B畫面,並選擇performSegueWithIdentifi
er:sender:,這樣兩個畫面就串起來了,當然你可以有很多路徑,比方說還可以有A->C 或 A->D 之類的。

重點來了,那我在程式碼裡面要做什麼修改呢?

只要將原本的 pushViewController:animated: 的地方更改為以下這樣就可以了[code][self.navigationControllerperformSegueWithIdentifier:@"SegueLevel1" sender:self];[/code]其中SegueLevel1 是我自己訂的轉接頭名稱,如果你有很多路徑的話,那麼就可以有多個 Segue。

這樣做法的好處是我可以很快的把故事情節描述出來,萬一客戶的畫面之間改來改去的,那麼我只要變更我的 Storyboard,只要Segue identifier 不變,程式碼自然就不需要修改了。不過少了 xib 一時間倒是有點不習慣呢!



StoryBoard優勢

 

 

 

StoryBoardiOS5的新特徵,旨在代替歷史悠久的NIB/XIB(其實StoryBoard還是基於NIB/XIB的,不過開發人員已經無需直接跟NIB打交道了)。目前關於StoryBoard的文檔並不多,蘋果的iOS5的開發者文檔裏也僅有不多的介紹。所以,本文只是簡單的談談本人對StoryBoard的一些粗淺的理解。(StoryBoard有時也叫做StoryBoarding,我不太注意這種細節,所以兩個詞經常會混用,如果你英語可以的話,能體會到兩者的細微差別)

[轉載]iOS <wbr><wbr>5的StoryBoard

StoryBoarding機制比之NIB/XIB的的優勢何在呢?個人認爲,StoryBoard有以下幾個優點:

能夠減少很多跟View相關的代碼;

能夠使ViewController進一步解耦;

能夠優化程序的頁面流,使程序的結構更清楚;

要理解這些優點,我們先要對NIB有一個基本的認識。通常,NIB是和ViewController相關聯的,很多ViewController都有對應的NIB文件。NIB文件的作用是描述用戶界面以及初始化對象和界面元素對象。其實開發者在NIB裏描述的界面和初始化的對象都能夠在代碼中實現;之所以用InterfaceBuilder來繪製界面,是爲了減少那些設置界面屬性的無聊和重複的代碼,讓開發人員能夠集中精力做程序的功能。

StoryBoard的出現,則是進一步加強了這方面的功能;NIB文件是沒有辦法描述從一個ViewController到另一個ViewController的過渡的。這種過渡只能靠手寫代碼來實現。相信很多人都會經常用到 -presentModalViewController:animated:以及-pushViewController:animated:這兩個方法。這種代碼在Storyboarding裏將成爲歷史;取而代之的是SegueSegue定義了從一個ViewController到另一個ViewController的過渡。在Storyboard裏,我們只需要像連接界面對象和ActionMethod那樣把ViewController之間用Segue連接起來就可以了,不再需要手寫代碼了。即便你像自定義Segue,你也只需寫Segue的實現,而無需編寫調用的代碼,StoryBoard會幫你調用的。這就是上面所說的第一個優點。

[轉載]iOS <wbr><wbr>5的StoryBoard


要用好Storyboarding機制,那麼必須嚴格遵守MVC原則。要讓ViewController充分解耦;並且不同的Controller之間也要充分解耦。否則,程序的業務邏輯就會亂成一團,很難理解,維護和除蟲(Debug)。

舉個例子來說:在過去,特別是初學CocoaTouch開發的時候,很多人都喜歡直接把AppDelegateViewController用,直接在AppDelegateMainMenu.xib之間交互。應該說,這是一個非常不好的習慣。AppDelegate的作用很簡單,就是處理UIApplication的回調,而不應該負責用戶界面的處理。很多iOS教程爲了省事,都直接把AppDelegateViewController用,甚至直接舉例在UIWindow上繪製界面。雖然,作爲教程這麼做很簡單明瞭,因爲UIWindow也是UIView的子類,但是這卻不是一種優良的實踐。因爲由ViewController來負責處理View纔是正確的做法。

近一段時間,蘋果的項目模版經常發生改變,特別是自從Xcode4發佈之後,程序模版(如,View BasedApplication)開始鼓勵使用UIWindowrootViewController屬性來指定第一屏的ViewController,以保證AppDelegate專注於它應該做的事情。而引入StoryBoard之後,AppDelegate已經不管ViewController的事情了;第一屏所使用的ViewController(也就是rootViewController)可以在StoryBoard中設置。這樣,程序的入口點就能從StoryBoard設計圖上一目瞭然了。這是第二個優點。

[轉載]iOS <wbr><wbr>5的StoryBoard


至於第三個優點,就是StoryBoard設計圖了。StoryBoard能夠包含一個程序所有的ViewController以及它們之間的連接。因此,StoryBoard甚至可以作爲程序的設計圖來用了。理想情況下,在程序開發接近尾聲的時候,我們只需對比StoryBoard流程和最初程序的設計流程,就知道程序有沒有走樣了。



說完了優點,我們來看看從NIB/XIBStoryBoard的遷移,我們需要有哪些理解和實踐上的改變呢?

首先,自然是(在做程序開發的時候)ViewController不再需要NIB/XIB了(雖然在後臺還是用的NIB)。以前在NIB/XIB上做的連接OutletAction的操作都可以在StoryBoard上完成了;

第二,孤兒View(獨立於ViewControllerView)是不能出現在StoryBoard裏的,View必須通過ViewController來管理(StoryBoard更像是Controller對象的容器,而不是View對象的容器,NIB/XIB可以作爲View對象的容器);

第三,ViewController之間的過渡代碼已經是歷史了,用StoryBoard可以直接可視化地連接不同的ViewController

第四,UIWindow對象的作用被進一步淡化,甚至可以這麼說:其實很多程序根本無需用到UIWindow對象。AppDelegate也不再被鼓勵(也不能)用來做ViewController--你甚至無法在InterfaceBuilderStoryBoard圖上找到AppDelegate對象--因爲它本來就不應該用來處理界面(View)的。

最後,寫優質的代碼,嚴格遵守MVC設計模式,這樣不僅能夠讓你用好StoryBoard,也能幫助你理解StoryBoard的原理。

StoryBoard是非常好的鼓勵MVC和代碼解耦的手段,能夠讓開發人員寫出更加容易維護的代碼。不過對於初學者來說,確實是個對理解力的小挑戰。不過作爲初學者也不用擔心,一旦突破了理解障礙,你就會發現StoryBoard也非常好用--就像最初理解NIB/XIB時,OutletAction“拉線拉線去,看起來也很神奇;理解之後,發現原來拉線神馬的也沒那麼神祕。

好了,絮


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章