日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

StoryBoard概览

發布時間:2024/10/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?
  • -(void)touchesEnded:(NSSet?*)touches?withEvent:(UIEvent?*)event??
  • {??
  • ????UITouch?*t?=?(UITouch?*)[touches?anyObject];??
  • ????if(t.tapCount?==?2)??
  • ????????[self?performSegueWithIdentifier:@"toGreen"?sender:self];??
  • }??
  • 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?
  • -(BOOL)shouldPerformSegueWithIdentifier:(NSString?*)identifier?sender:(id)sender??
  • {??
  • ????if([identifier?isEqualToString:@"buttonToViewControllerGreen"])??
  • ????????return?NO;??
  • ???else??
  • ???????return?YES;??
  • }??

  • -------------------------------分界線------------------------------

    ?

    為了滿足自己的求知欲,對這兩種調用做了一些調試,讓我們來看看顯式跳轉和隱式到底是什么。

    直接上圖。



    ?

    結論:

    一 兩種跳轉方法,最終都是調用了才執行跳轉。

    二 區別是,在調用的堆棧中,隱式調用多了一個。(也有可能是直接把這個方法作為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概览的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。