iOS應(yīng)用開(kāi)發(fā)中StoryBoard搭建UI界面的基本使用講解
StoryBoard 的本質(zhì)
StoryBoard 是蘋果在 iOS 5 中引入的新技術(shù)方案,目的是給紛繁復(fù)雜的 nib、xib 們一個(gè)溫暖的家,讓他們之間的關(guān)系更直觀地展示出來(lái),并提供了一種新的頁(yè)面間跳轉(zhuǎn)方式 segue。
StoryBoard 的本質(zhì)是一個(gè) XML 文件,描述了若干窗體、組件、Auto Layout 約束等關(guān)鍵信息。示例文件:https://github.com/johnlui/AutoLayout/blob/master/AutoLayout/Base.lproj/Main.storyboard
但是,我們應(yīng)該認(rèn)識(shí)到一個(gè)更重要的本質(zhì):使用 StoryBoard 的 iOS 項(xiàng)目均以初始化 StoryBoard 文件作為整個(gè)程序的初始化入口,UIViewController 類是由于被 StoryBoard 綁定而初始化,從而開(kāi)始運(yùn)行的。從下面兩個(gè)地方可以找到蛛絲馬跡:
奇怪的 bug
初學(xué) iOS 開(kāi)發(fā)的時(shí)候,如果使用了 StoryBoard,大家可能遇到過(guò)這個(gè)奇怪的 bug,頁(yè)面全黑:
如果大家跟我一樣純靠找資料自學(xué)而沒(méi)有人教的話,一定出現(xiàn)過(guò)死活找不到原因而新建一個(gè)項(xiàng)目的尷尬情況吧 o(╯□╰)o,其實(shí)秘密在這里:
這表示這個(gè)窗體是此 StoryBoard 的初始窗體的意思,這樣 APP 在啟動(dòng)以后,會(huì)先啟動(dòng)主 StoryBoard,主 StoryBoard 會(huì)啟動(dòng)它的初始窗體,初始窗體啟動(dòng)跟他綁定的類,這樣 APP 就啟動(dòng)完成了。
多 StoryBoard 最佳實(shí)踐
托福喵 【已下架】1.0 版是我第一個(gè)上架的項(xiàng)目,只用了初始化項(xiàng)目時(shí)建立的那唯一的 Main.storyboard,里面有二十幾個(gè)窗體,在 Xcode 里每次點(diǎn)擊打開(kāi)都要等五秒才能完全渲染完畢,而且 Segue 線交錯(cuò)縱橫,非常凌亂。這顯然不是個(gè)好的組織方式。
我現(xiàn)在正在重寫的托福喵第二版已經(jīng)采用了多 StoryBoard 的解決方案,把一些獨(dú)立的窗體組合放到一起使用一個(gè) StoryBoard 進(jìn)行組織,比如登陸注冊(cè)的幾個(gè)窗體,考試界面的幾個(gè)窗體,關(guān)于我們的幾個(gè)窗體等。下面我們將一起學(xué)習(xí)如何使用多 StoryBoard。
新建第二個(gè) StoryBoard
如下圖:
給 Second.storyboard 拖入一個(gè) View Controller:
如何調(diào)用 Second.storyboard 中的窗體?
首先,編譯項(xiàng)目,我們得到如下警告:
這個(gè)警告的意思是,這個(gè)窗體沒(méi)有入口,無(wú)法被觸達(dá)。如何讓他能夠被觸達(dá)??jī)煞N方式:
設(shè)置為該 StoryBoard 的初始窗體:
給該窗體設(shè)置一個(gè) StoryBoard ID:
能夠被觸達(dá)之后,讓我們用代碼調(diào)用他們:
① 作為初始窗體
let vc = UIStoryboard(name: "Second", bundle: nil).instantiateInitialViewController() as! UIViewController
self.navigationController?.pushViewController(vc, animated: true)
② 設(shè)置了 StoryBoard ID
let vc = UIStoryboard(name: "Second", bundle: nil).instantiateViewControllerWithIdentifier("First") as! UIViewController
self.navigationController?.pushViewController(vc, animated: true)
當(dāng)然,也可以用 self.presentViewController 調(diào)用他們。
查看效果
多個(gè)storyboard間跳轉(zhuǎn)總結(jié)
Stroyboard 可以被看作一個(gè)管理View畫面的集合。也就是說(shuō)一個(gè)iOS專案裡面并沒(méi)有限制只能有一個(gè)Storyboard。
所以在你的APP專案中,你可以把功能相近的View放到同一個(gè)APP之中,形成一個(gè)群組,方便功能上的管理。
1.在專案中準(zhǔn)備2個(gè)Storyboard
在一個(gè)IOS的專案裡面建立兩個(gè)StoryBoard。
2. 在第一個(gè)StoryBoard中,我們拉出了一個(gè)Navigation 的Template,在[Main View Controller]這個(gè)中View裡面拉進(jìn)一個(gè)Button。
3. 接著在第二個(gè)StoryBoard裡面我們也拉出一個(gè)Navigation template。
在畫面中拉一個(gè)Label標(biāo)籤,并且在裡面我們把文字改成Storyboard2。這只是用來(lái)識(shí)別目前我們被帶到哪一個(gè)畫面之中。
4. 在第一個(gè)StoryBoard畫面中的Botton裡面,我們要在按鈕的[TouchUpinside]事件中撰寫底下的程式碼。
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"Storyboard2" bundle:nil];
UIViewController* test2obj = [secondStoryBoard instantiateViewControllerWithIdentifier:@"test2"]; //test2為viewcontroller的StoryboardId
[self.navigationController pushViewController:test2obj animated:YES];
第一步就是要先指定UIStoryboard物件,這邊我們要指向?qū)0钢械牡诙€(gè)Storyboard。
接下來(lái)我們要先New出一個(gè)Controller物件,這是你要Push到的下一個(gè)View頁(yè)面,他所對(duì)應(yīng)的Controller。
最后使用self.navigationController推網(wǎng)頁(yè)到下一頁(yè)。
相關(guān)文章
IOS 應(yīng)用之間的跳轉(zhuǎn)和數(shù)據(jù)傳遞詳解
這篇文章主要介紹了IOS 應(yīng)用之間的跳轉(zhuǎn)和數(shù)據(jù)傳遞詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09iOS開(kāi)發(fā)網(wǎng)絡(luò)篇—實(shí)現(xiàn)大文件的多線程斷點(diǎn)下載
iOS開(kāi)發(fā)中經(jīng)常會(huì)用到文件的下載功能,這篇文章主要介紹了iOS開(kāi)發(fā)網(wǎng)絡(luò)篇—實(shí)現(xiàn)大文件的多線程斷點(diǎn)下載,今天咱們來(lái)分享一下思路。2016-11-11iPhoneX無(wú)導(dǎo)航欄頁(yè)面適配問(wèn)題解決方案
這篇文章主要介紹了iPhoneX無(wú)導(dǎo)航欄頁(yè)面適配問(wèn)題解決方案,原全屏適配在iPhoneX會(huì)由于安全區(qū)域的變化導(dǎo)致顯示不全,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-11-11IOS開(kāi)發(fā)中使用UIFont設(shè)置字體及批量創(chuàng)建控件
這篇文章主要介紹了IOS開(kāi)發(fā)中使用UIFont設(shè)置字體及批量創(chuàng)建控件的方法,內(nèi)容很實(shí)用,感興趣的小伙伴們可以參考一下2016-03-03怎么防止ios系統(tǒng)被抓包?防止ios系統(tǒng)被抓包的方法
怎么防止ios系統(tǒng)被抓包?下面小編就為大家分享一篇防止ios系統(tǒng)被抓包的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12詳解iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)于享元模式的運(yùn)用
這篇文章主要介紹了iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)于享元模式的運(yùn)用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-04-04