2012年2月6日 星期一

所見即所得再進化 - iOS5 Storyboard

StoryBoard絕對是iOS5讓人眼睛一亮的功能
在iOS5之前,我們已經可以透過Interface Builder中去編輯xib來設計View Controller的look & feel
而StoryBoard的導入更可以直接的把整個WorkFlow都也一併的加入
讓我們透過一個StoryBoard檔,就可以看得出整個應用程式的概括
對於開發的效率絕對是有所助益。

然而在我開始接觸StoryBoard之前,
我有幾個觀察重點
1. 能不能夠相容於iOS5以下的版本
2. 能不能完全取代.xib
3. 用了Storyboard之後會不會有什麼樣的限制?
4. 用了Storyboard之後,可否跟舊的.xib共存?
先來跟大家解答,再逐一解釋,
答案是1.No 2.Yes 3.No 4.Yes
除了1的答案比較可惜以外,其他應該是很正面的答案

1.的部分因為StoryBoard中多了幾個UIStoryboard的class,
而UIViewController也增加新的UIStroyboard的method,property
所以只能在iOS5之後使用,
這點我認為是唯一現在不開始用Storyboard的考量,其他都不是太大的問題。

2. 能完全取代.xib!! 事實上.storyboard可以說是.xib的集合,
並且又增加了view controller之間的關聯 (segue)
所以我認為我們可以直接透過.storyboard來做所有xib的事情,
並且集中在一個storyboard絕對是個好方法。

3. App中始用了Storyboard之後不會有什麼增加的限制。
雖然看起來Storyboard好像會把ViewController到另一個ViewController中的行為定的死死的,
但事實上不然。

首先,對於非常死的動作當然用Storyboard可以定義到說按下某個button之後,
navigate到哪個ViewController這種行為可以透過拖拉就完成,
不需要去寫code。

再來,如果是說要做到conditional action的動作。
例如可能想要做到說按下按鈕,在某種condition才會去做這個segue的動作。
這也是OK的,
因為我們還是可以透過UIViewController的-[UIViewController performSegueWithIdentifier:sender:]去用程式的方法去執行你的segue。
也就是說在這個需求的情況下,
我們應該是要自己去實作這個event的action
並且在你的情況成立時,再去透過上述的方法去執行你的segue。

再來就是segue也沒有一定要綁在某個UIControl上面,
我們可以直接定義一個UIViewController到另外一個UIViewController的segue
方法是直接在UIViewController上面control+click拖曳到另外一個UIViewController,
就可以新增一個segue
之後也是一樣是透過-[UIViewController performSegueWithIdentifier:sender:]去執行你的segue..

最後,你如果不想用segue的方法去瀏覽,
你還是可以用最傳統的方式,或是用xib的方式,產生你的UIViewController
再透過push或是modal的方式瀏覽你的view controller。

以上可知,用了storyboard只是把一些常用的動作簡化。但是複雜的行為還是可以用舊的方法達到目的

4. Storyboard可以跟xib並存是肯定的。甚至你的application bundle可以有多個.storyboard跟.xib並存都沒問題
我們可以透過+[UIStoryboard storyboardWithName:bundle:]去取得Storyboard的instance
再透過這個instance來產生initial view controller或是某個identifier的view controller,
可以視你的程式所需要的模組化需求來決定哪些要放在同一個Storyboard當中。
例如我可以把所有設定相關的部分放在Settings.storyboard當中,
而其他應用程式Workflow放在MainStoryboard.storyboard。
至於很獨立的UIViewController,則單獨定義一個.xib檔
並且透過-[UIViewController initWithNibName:bundle:]來產生。

另外說一下我覺得用Storyboard來取代xib的優點。
由於我們現在可以把UITabViewController, UINavigationController,
還有我們的所有自訂的ViewController連在一起。
以往我們要拖拉元件時,要手動告知Interface Builder說我的ViewController有navigation bar,有tab bar,
現在因為多了這些關聯變成一切更自動了。

以下面圖中的例子
原本是沒有UINaviationController的
我們就會看到沒有Navigation bar

如果我加上了UINavigationController
就會多出了NavigationBar

如果我再加上UITabViewController
則TabBar也會自動跑出來,
這也算是用了Storyboard才會有的好處。

我的結論是
如果你開發的app沒有要支援iOS5以下的target
那我會毫無考慮的建議你就直接用Storyboard吧!!!











2 則留言:

  1. 如果5.1沒太大問題,我認為支援iOS5以下沒啥必要
    尤其是非JB用家

    回覆刪除
  2. 請問一下,您在產生Navigation controller之後
    又嵌入了tab controller,
    請問是怎麼做到的??
    (如何嵌入?)
    謝謝

    回覆刪除