StoryBoard概览
緒論
?
storyboard,直譯的話就是“故事板”。什么是故事呢?簡單來說,故事由人物和情節構成,告訴我們什么人干了什么事。沒錯,storyboard也是由人物(viewcontroller)和情節(Segue)構成,向我們展示了一個app的運行流程。
(0-1)
通過storyboard,我們可以清楚的掌握整個app的流程。在項目中,我們也可以通過storyboard快速的做出app的雛形,便于展示和修改。
如圖0-1所示,(1)這種箭頭指向的控制器表示初始控制器,即第一個顯示的控制器。可以通過點擊viewController,勾選is initial view controller,將相應的viewController設置為初始控制器。如圖0-2所示。
ps:一個storyboard只能有一個initial view controller。
(0-2)
(3)和(5)這種箭頭,就是我們的“情節”(也就是Segue),它表示“從一個視圖切換為另一個視圖”這個動作。
首先,一個Segue有一個identifier屬性,該屬性為NSString類型,表示Segue的名字。(當我們新建一個Segue的時候,默認identifier為nil,需要手動設置。)其次,一個Segue有一個源控制器(sourceViewController)和一個終點控制器(destinationViewController)。拿(5)來說,sourceViewController就是(4),而destinationViewController就是(6)。最后,Segue一般有三種類型,關于不同類型之間有什么區別,我們下邊再說。
------------------------------
下面,我們通過實踐來深入了解storyboard。(例子簡單,不實用,主要是為了突出各種api的使用方法)
?
一 在empty Application下使用storyboard
1>新建一個empty Application。
2>建立一個storyboard。
3>拖一個viewController到storyboard。(隨意拖一個控制器就好)
4>點擊項目->點擊TARGETS->在Main StoryBoard下拉框中選擇步驟2中建立的storyboard。(如圖1-1)
(1-1)
5>刪除AppDelegate.m中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法下的語句,只留return YES;ps:不要把AppDelegate.h中的windows屬性刪除。大家可以試一試刪除之后的效果。
6> run
?
二 在storyboard中建立segue并嘗試跳轉
大體有兩種跳轉方式,button-to-viewcontroller 和?viewcontroller-to-viewcontroller。下面分別介紹。
viewcontroller-to-viewcontroller
1>在storyboard中拖兩個viewController。
2>如圖2-1所示,
點擊紅色viewController,(注意,確定點擊的是viewController而不是viewController下的view)并按住右鍵,這時會出來一根藍色的線,拖至綠色viewController下方開右鍵。這時會出現圖2-2,在這里,我們選擇中間的modal。也可以通過圖2-3的方式建立segue。
(2-2)(2-3)
?
3>在圖2-4的位置選擇剛剛建立好的segue,在圖2-5的位置,為其命名。
(2-4)(2-5)
?
4>這樣,我們就建立了一個segue,接下來,我們便要思考,怎么才能執行這個segue。我們的方案是雙擊紅色viewcontroller來進行跳轉。要實現這個功能,我們則必須實現紅色viewcontroller的相應事件方法。所以接下來我們看看怎么給storyboard中的控制器定制代碼。
首先,我們需要新建一個UIViewController的子類(圖中viewControllerRed),并將其與storyboard中相應的控制器綁定。綁定方法如圖(2-6)
(2-6)
注意:綁定是必須的步驟。
之后,在ViewControllerRed.m中添加下面代碼,用于雙擊跳轉。
?
[plain]?view plaincopyprint?5>run
?
?
button-to-viewcontroller
接下來,我們試一試第二種跳轉方式。
1>和上面的步驟大體相同。在紅色控制器上添加一個button,以button為起點連接到綠色控制器,建立segue。
2>run,可以通過單擊button執行跳轉,無需寫代碼。
兩種跳轉方式的區別
可以粗略的理解為顯式調用和隱式調用。
在顯式調用中,我們使用- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 進行跳轉。好處便是,我們可以控制跳轉,我們可以設置一些if-else語句來達到我們想要的目的,例如文本框為空的時候不跳轉之類。
而在隱式跳轉中,我們點擊button,便會自動跳轉。那怎么控制跳轉呢?我們可以通過重寫- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender來達到目的。
這個方法如果返回no,所有隱式跳轉都不會執行(只是隱式跳轉,顯式跳轉不會受其影響)。默認是返回yes的。
利用這個方法,我們可以控制跳轉。例如,我們要屏蔽某個button執行跳轉,可以這樣寫。
?
[plain]?view plaincopyprint?
-------------------------------分界線------------------------------
?
為了滿足自己的求知欲,對這兩種調用做了一些調試,讓我們來看看顯式跳轉和隱式到底是什么。
直接上圖。
?
結論:
一 兩種跳轉方法,最終都是調用了才執行跳轉。
二 區別是,在調用的堆棧中,隱式調用多了一個。(也有可能是直接把這個方法作為button的action)而也正是這個方法,才導致shouldPerformSegueWithIdentifier被調用。
?
三 使用不同類型的segue
如圖(2-2),當我們見了一個segue的時候,有大體三種segue供我們選擇。
如果我們在不同的segue下做調試,我們便會發現,segue的實質不過是封裝了各種跳轉罷了。
modal,實質上是調用UIViewController的persentModalViewController進行跳轉。而push則是調用了UINavigationViewController的pushViewController進行跳轉(這也是該類型的segue需要sourceViewController為Navigation的原因)。所以,我們可以自定義任何我們需要的跳轉類型,這也正是custom類型的正確用法,即,通過繼承UIStoryboardSegue類,實現自定義跳轉。
ps:(iphone下)關于segue的類型,我一直說是大體有三種,這是因為不止有三種。當我們拿一個tabBarViewController來做源控制器的時候,我們建立segue,可以發現一個新segue類型,名為 View Controller。關于這種類型,我不確定它到底是不是一個segue。首先,我們不可以為其定義id(這意味著我們不能執行顯式跳轉)。其次,在斷點調試下,它并沒有調用任何與segue相關的方法。所以我推測,這個類型的segue,可能是由tabBarViewController定義,而非UIStoryBoardSegueTemplate定義。
四 在viewController間傳遞數據
傳遞數據的話,使用- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 是再正確不過的辦法。
通過參數segue,我們可以輕松獲得兩邊的控制器。并在該方法下實現數據傳遞。
五 圍觀ios6新增功能
就是這個。光標移過去會出現Exit字樣。
?
在說UnwindSegue之前,先來說說ios5下storyboard的一種情況。
事情是這樣的,將一個TableViewController作為一個NavigationController的根控制器,tableViewController使用modal類型的segue打開一個新的ViewControlller。怎么關閉這個ViewController,返回到TableViewController?
這種情況在ios5下,是必須要用代碼來關閉的。
代碼如下:
[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
?
我曾經企圖通過新建segue來跳回去,雖然是跳回去了,但TableViewController上面的導航欄不見了。這是因為modal類型的segue的實質就是調用了persentModalViewController來呈現一個控制器,我希望跳轉到的TableViewController是由NavigationController呈現的,而通過segue來跳轉,跳轉去的TableViewController卻是由這個新的ViewController呈現的。所以這個TableViewController并不是原來的那個TableViewController。
?
到了ios6,UnwindSegue可以解決這種尷尬的情況。
嚴格來說使用segue進行的并不能叫“跳轉”而是“呈現”,使用UnwindSegue才是真正的跳轉,它可以使你跳轉到任意一個控制器。
(斷點調試了一下,UnwindSegue應該把ios5中用于返回的代碼進行了復雜的封裝。但原理是一樣的。即:storyboard實現任何場景的過度,都是對UIViewController類中相關方法的調用與封裝)
?
好了,現在來看看怎么用UnwindSegue,初步的使用很簡單。
1>在你希望跳轉的控制器的.m文件中,實現該方法。-(IBAction)anyThing:(UIStoryboardSegue *)segue (我們也可以在這個方法里傳遞數據)
2>Product->Build。(我是這么做的)到storyboard面板,選擇該控制器,右鍵控制器下那個綠的圖標。會發現我們剛剛實現的那個方法。
3>以該方法為起點,和你希望觸發跳轉的控件做連線。
4>run
?
轉載于:https://www.cnblogs.com/yaoxc/p/3727308.html
總結
以上是生活随笔為你收集整理的StoryBoard概览的全部內容,希望文章能夠幫你解決所遇到的問題。