一天一點(diǎn)xib:6該聊聊SB了

引言

下面我們來學(xué)習(xí)比xib更強(qiáng)大的SB

如何理解SB?

最簡單的理解就是:一個.storyboard文件相當(dāng)于多個基于VC使用的.xib文件恩商,由此我們可以看出,SB(只能基于VC,不能基于View),我們有多個VC的類是可以和一個SB文件建立關(guān)系的听系,使用方法:

SecVC *secVC = [[UIStoryboard storyboardWithName:@"Demo" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"SecVC"];

之前的一天一點(diǎn)xib:2初識xib有過介紹, 通過這個方法,我們傳入不同VC的identifier虹菲,就會得到不同的VC對象靠胜。

為什么是強(qiáng)大了?

xib可以基于View毕源、VC甚至自己獨(dú)立的使用髓帽,而SB只能基于VC使用,為什么說比xib更加強(qiáng)大呢脑豹?主要是下面的兩個原因:

1.SB支持segue

2.SB對cell的支持更加強(qiáng)大

什么是segue?

想象我們點(diǎn)擊一個VC中的button后跳轉(zhuǎn)到另一個VC的場景衡查,通常用的都是navigationController的push瘩欺,或者present一個模態(tài)視圖,即使有xib的情況下,要完成跳轉(zhuǎn)其實(shí)也不簡單俱饿,要把按鈕拖到@implementation中實(shí)現(xiàn)一個IBAction的方法歌粥,然后在里面寫上:

[self.navigationController pushViewController:Sec animated:YES]

或者

[self presentViewController:Sec animated:YES completion:nil]

要想簡化這個沒有技術(shù)含量的過程,就要用到SB的segue拍埠。


我們在一個VC中選擇要發(fā)生跳轉(zhuǎn)的按鈕失驶,按control拖動到另一個VC上就會出現(xiàn)一個菜單,在菜單上你就可以選擇跳轉(zhuǎn)的方式push枣购、present嬉探,這樣不用寫一行代碼就能完成頁面間的跳轉(zhuǎn),而兩個VC之間的像紐扣一樣用線連著兩個VC的的東西就是segue棉圈,是一個UIStoryboardSegue對象涩堤,我們可以簡單的理解成是完成頁面跳轉(zhuǎn)相關(guān)功能的一個類,是不是很簡單分瘾?

segue雖然簡單胎围,如何傳參?

我們知道用SB的segue來實(shí)現(xiàn)也頁面跳轉(zhuǎn)十分方便德召,但是如果要向跳轉(zhuǎn)的頁面?zhèn)鲄⒃撛趺崔k白魂?

假設(shè)我們要點(diǎn)擊ViewController這個VC里的一個按鈕,跳轉(zhuǎn)到SecVC這個VC中上岗,把testTitle這個參數(shù)傳過去福荸。第一步還是要選中按鈕,拖到SecVC里液茎,然后選中這個segue逞姿,給它一個id值,確保用代碼可以找到它捆等,然后在ViewController中編碼:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"sec"]) {
        SecVC *secVC = (SecVC *)segue.destinationViewController;
        secVC.testTite = @"hello world";
    }
}

設(shè)置SB中segue的identifier滞造,主要就是要在這里使用,因?yàn)槎鄠€button發(fā)生的多個頁面跳轉(zhuǎn)都是回調(diào)這個函數(shù)栋烤,所以要用identifier來區(qū)分是哪個segue谒养,跳哪個頁面,傳哪些參數(shù)明郭。
id的sender就是觸發(fā)跳轉(zhuǎn)的那個button或其他控件买窟。

不確定的跳轉(zhuǎn)如何使用segue?

一下場景經(jīng)常出現(xiàn):甲VC中有個button薯定,點(diǎn)擊后有可能跳轉(zhuǎn)到乙頁面始绍,也可能跳轉(zhuǎn)的丙頁面,怎么解话侄?

我們假設(shè)我們要點(diǎn)擊ViewController這個VC里的一個按鈕亏推,有可能要跳到SecVC学赛,有可能要跳thirdVC。
1.在SB中準(zhǔn)備segue吞杭。

注意我們這次創(chuàng)建的segue的方式并不是選中button按control拖到另一個VC中盏浇,而是選中VC,右鍵選中triggered segues里manual后面的+拖動到另一個VC里芽狗,這個很重要绢掰,而且還是要給segue一個id。

2.編碼實(shí)現(xiàn)跳轉(zhuǎn):

- (IBAction)testSegue:(id)sender
{
    BOOL flag = NO;
    if (flag) {
        [self performSegueWithIdentifier:@"sec" sender:sender];
    } else {
        [self performSegueWithIdentifier:@"third" sender:sender];
    }
}

代碼實(shí)現(xiàn)segue跳轉(zhuǎn)也很簡單:

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender

第一個參數(shù)是segue的id童擎,第二個參數(shù)是觸發(fā)這個跳轉(zhuǎn)的控件滴劲。
在segue跳轉(zhuǎn)頁面的過程中還會調(diào)一個函數(shù),我們可以重寫這個函數(shù)柔昼,來決定是否讓這個跳轉(zhuǎn)發(fā)生哑芹。eg:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if (_islogin) {
        return YES;
    } else {
        NSLog(@"您還沒有登錄,請先登錄"); //用log舉個例子
        return NO;
    }
}

更靈活的segue

如果你熟練掌握了segue他其實(shí)可以做很多事情捕透,其實(shí)segue并不僅僅能完成跳轉(zhuǎn)聪姿,還有一類segue叫做relationship segue,之前是幫助大家理解乙嘀,所以說的比較簡單末购,其實(shí)我們選中一個NavigationController按control鍵拖動到另一個VC上的話也可以生成segue,我們選中root view controller虎谢,就將Nav的rootViewController屬性設(shè)置成了這個VC盟榴,這個segue就是relationship segue,同樣婴噩,拖動一個tabbarController也會出現(xiàn)viewControllers的relationship segue擎场。

更好的使用Cell

用xib的時候,要想用cell几莽,通常是建立一個cell子類迅办,一個與之對應(yīng)的.xib文件。用SB的時候要想用cell就簡單的多了章蚣,因?yàn)閏ell是可以直接拖動到tableView里的站欺,直接在tableView里管理cell設(shè)置屬性,當(dāng)然如果是復(fù)雜的cell還是要子類話對應(yīng)的.h纤垂、.m的矾策。

SB在使用cell分兩種情況:1靜態(tài)cell,2動態(tài)cell峭沦。

靜態(tài)cell

設(shè)置靜態(tài)cell:

注意靜態(tài)cell一定要基于UITableViewController贾虽,否則會報錯。
展示靜態(tài)cell的tableView是不用調(diào)用自己必須實(shí)現(xiàn)的datasource協(xié)議的

你會很驚訝吼鱼,為什么必須調(diào)用的datasource協(xié)議都不用實(shí)現(xiàn)榄鉴?答案是靜態(tài)履磨,靜態(tài)的cell,意義就在于你在xib中設(shè)置成什么樣庆尘,他就展現(xiàn)什么樣,不會再調(diào)用datasource向你要cell了巷送,因?yàn)樵赟B文件中已經(jīng)確定下來了驶忌。

在做一些“死”頁面的時候SB的靜態(tài)cell是很好的選擇,靜態(tài)cell也不是什么都不能做笑跛,靜態(tài)cell里的button還是可以拖到@implementation中形成IBAction的付魔,但是是無法生成IBOutlet屬性或字段的。

即使你強(qiáng)行的給一個靜態(tài)的cell指定了一個cell的類飞蹂,也是無法向其內(nèi)部拖入IBOutlet的几苍。這就是靜態(tài)cell的局限性,但是如果你要設(shè)置的數(shù)據(jù)不多還是可以考慮用靜態(tài)cell陈哑,因?yàn)槟憧梢酝ㄟ^給cell上的控件設(shè)tag來找到它從而賦值妻坝。

動態(tài)cell的使用

在上圖中設(shè)置content屬性為Dynamic Prototypes就可以了。使用動態(tài)cell的話就要在VC中實(shí)現(xiàn)那兩個必須實(shí)現(xiàn)的datasource協(xié)議了惊窖,下面舉個簡單的例子:
1.給cell指定一個class

2.給cell設(shè)置id刽宪,重用機(jī)制使用,其他屬性就不詳細(xì)說明了界酒,和其他控件的屬性差不多圣拄。

3.給cell添加一些控件,并拖到TestCell源文件中生成IBOutlet的屬性毁欣,在VC中實(shí)現(xiàn)那兩個必須實(shí)現(xiàn)的協(xié)議方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TestCell *testCell = (TestCell *)[tableView dequeueReusableCellWithIdentifier:@"testCell"];
    testCell.testLabel.text = @"hello world";
    return testCell;
}

這里注意庇谆,不需要在tableView:cellForRowAtIndexPath:中創(chuàng)建cell了,這是與xib使用cell最大的區(qū)別凭疮,下面是xib使用cell的方法舉例:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TestCell *testCell = (TestCell *)[tableView dequeueReusableCellWithIdentifier:@"testCell"];
    if (!testCell) {
        testCell = [[NSBundle mainBundle] loadNibNamed:@"TestCell" owner:self options:nil];
    }
    testCell.testLabel.text = @"hello world";
    return testCell;
}

這是很重要的饭耳,千萬記住,因?yàn)槲覀兪侵苯油蟘ell到SB文件的tableView里的哭尝,所以直接從重用池里取就好了哥攘。

這里稍微提一個地方:我們這里取重用cell用的是函數(shù):
dequeueReusableCellWithIdentifier:,而系統(tǒng)中還有另一個重用的函數(shù):dequeueReusableCellWithIdentifier:forIndexPath:這個函數(shù)比我們代碼中用的那個好材鹦,是我們用的那個api的優(yōu)化版逝淹,它是iOS6引入的api,完全符合我們一般app對版本兼容的要求桶唐,這里感謝簡書用戶coderzcj在評論中給我留言栅葡,謝謝你。我后續(xù)會再寫一篇文章專門說說系統(tǒng)對xib優(yōu)化的事情的尤泽,非常感謝大家的支持欣簇。

總結(jié)

SB的segue和cell使用是它最大意義的地方规脸,當(dāng)然之前xib能做的設(shè)置,SB也都能做熊咽,而且多個.xib對應(yīng)一個SB文件莫鸭,使文件量變少了不少,但是如果想單獨(dú)用View的地方還是要用xib横殴。

歡迎大家和我交流溝通被因,若文章中有錯誤和紕漏,懇請指正衫仑,謝謝梨与。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市文狱,隨后出現(xiàn)的幾起案子粥鞋,更是在濱河造成了極大的恐慌,老刑警劉巖瞄崇,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呻粹,死亡現(xiàn)場離奇詭異,居然都是意外死亡杠袱,警方通過查閱死者的電腦和手機(jī)尚猿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楣富,“玉大人凿掂,你說我怎么就攤上這事∥坪” “怎么了庄萎?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塘安。 經(jīng)常有香客問我糠涛,道長,這世上最難降的妖魔是什么兼犯? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任忍捡,我火速辦了婚禮,結(jié)果婚禮上切黔,老公的妹妹穿的比我還像新娘砸脊。我一直安慰自己,他們只是感情好纬霞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布凌埂。 她就那樣靜靜地躺著,像睡著了一般诗芜。 火紅的嫁衣襯著肌膚如雪瞳抓。 梳的紋絲不亂的頭發(fā)上埃疫,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音孩哑,去河邊找鬼栓霜。 笑死,一個胖子當(dāng)著我的面吹牛臭笆,可吹牛的內(nèi)容都是我干的叙淌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愁铺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闻鉴?” 一聲冷哼從身側(cè)響起茵乱,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孟岛,沒想到半個月后瓶竭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渠羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年斤贰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次询。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡荧恍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屯吊,到底是詐尸還是另有隱情送巡,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布盒卸,位于F島的核電站骗爆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔽介。R本人自食惡果不足惜摘投,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虹蓄。 院中可真熱鬧犀呼,春花似錦、人聲如沸武花。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽体箕。三九已至专钉,卻和暖如春挑童,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跃须。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工站叼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菇民。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓尽楔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親第练。 傳聞我的和親對象是個殘疾皇子阔馋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 引言 這兩天突然想起之前看到過有的項(xiàng)目中用到了object, 好奇心起,就順便回溯下xib的使用吧 xib優(yōu)缺點(diǎn)分...
    舞動夢想閱讀 1,958評論 0 3
  • 引言 學(xué)到這里,xib給我?guī)淼膸椭呀?jīng)很大了娇掏,最大的莫過于UI控件的創(chuàng)建呕寝、屬性的賦值再也不用寫代碼,就UI開發(fā)來...
    二亮子閱讀 7,239評論 41 82
  • 1.自定義控件 a.繼承某個控件 b.重寫initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,391評論 2 4
  • 一 來看一下IB開發(fā)的優(yōu)點(diǎn)以及缺點(diǎn) 1.1 優(yōu)點(diǎn) 1.1.1 開發(fā)和維護(hù)效率高IB開發(fā)與純代碼開發(fā)相比婴梧, 效率至...
    奧卡姆剃須刀閱讀 1,501評論 5 10
  • ●理解widow對象--BOM的核心●控制窗口下梢、框架和彈出窗口●利用location對象中的頁面信息(locati...
    royluck閱讀 223評論 0 0