iOS 10可視化編程之XIB和Storyboard的類關(guān)聯(lián)及對(duì)象創(chuàng)建(4)

Storyboard的類關(guān)聯(lián)和對(duì)象創(chuàng)建

storyboard的類管理是非常簡單的。我們舉一個(gè)常用的例子。管理一個(gè)viewcontroller。
新建類,如圖29-1所示:

圖29-1

然后在storyboard中,拖入viewcontroller進(jìn)行關(guān)聯(lián)。如圖29-2所示:

圖29-2

這樣我們的TestViewController就和我們的storyboard的可視化文件進(jìn)行關(guān)聯(lián)起來了。

storyboard設(shè)置根視圖控制器

程序啟動(dòng)需要一個(gè)根視圖控制器,在storyboard中設(shè)置根視圖控制器是非常簡單的。如圖30-1所示:

圖30-1

先選中viewcontroller,然后勾選In initial View Controller,然后這個(gè)控制器的左側(cè)就會(huì)出現(xiàn)一個(gè)箭頭指向這個(gè)視圖控制器,這樣設(shè)置后,系統(tǒng)默認(rèn)加載的根視圖控制器就是我們的選中的控制器了。

系統(tǒng)啟動(dòng)后加載的storyboard

我們啟動(dòng)程序后,系統(tǒng)會(huì)默認(rèn)加載我們的Main.storyboard。其實(shí)我們可以更換storyboard。
新建storyboard文件,如圖31-1所示:


圖31-1

給我們創(chuàng)建的storyboard起個(gè)名字。如圖31-2所示:


圖31-2

然后現(xiàn)在系統(tǒng)默認(rèn)加載的依然是我們的Main.storyboard,我們現(xiàn)在給他更改成我們創(chuàng)建的Test.storyboard。如圖31-3所示:
圖31-3

更改完后,系統(tǒng)默認(rèn)加載的就是我們的Test.Storyboard了。現(xiàn)在有個(gè)問題,剛剛我們所說的根視圖控制器,指的是系統(tǒng)加載的storyboard中第一個(gè)運(yùn)行的視圖控制器。然而我們剛剛指定的Test.storyboard還沒有給他指定根視圖控制器。那么我們需要給他添加一個(gè)viewcontroller然后給他設(shè)置成Test.storyboard的根視圖控制器。如圖31-4所示:

圖31-4

然后這樣系統(tǒng)啟動(dòng)后,根視圖控制器就是我們Test.storyboard中的MyViewController。

Storyboard類的創(chuàng)建方式

我對(duì)可視化編程的類的創(chuàng)建堅(jiān)持一個(gè)原則就不會(huì)有問題。就是如果是XIB就用XIB的方式創(chuàng)建,如果是Storyboard就用Storyboard的方式創(chuàng)建,不要用 [[類名 alloc] init]。如果是純代碼編程就用[[類名 alloc] init],堅(jiān)持這個(gè)原則你就不會(huì)創(chuàng)建錯(cuò)誤。那么Storyboard的類創(chuàng)建有2種方式。
方式一
在storyboard中指定根視圖控制器的創(chuàng)建方式(ps:就是帶這種箭頭的方式創(chuàng)建)如圖32-1所示當(dāng)前這個(gè)類的創(chuàng)建。

圖32-1

我們創(chuàng)建一個(gè)對(duì)象:
引入頭文件

#import “TestViewController.h"

TestViewController *testVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateInitialViewController];

這里文件的名字一定要和可視化文件的名字保持一致,盡可能的去復(fù)制。如圖32-2所示:

圖32-2

方式二
在storyboard中不是根視圖控制器的創(chuàng)建,如圖33-1所示:我們創(chuàng)建一個(gè)Viewcontroller的對(duì)象

圖33-1

引入頭文件

#import "ViewController.h"

ViewController *hVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@“viewC"];

這里有一個(gè)Identifier,我們需要在可視化文件中設(shè)置。如圖33-2所示:

圖33-2

當(dāng)然,我們也可以給根視圖控制器設(shè)置Identifier,也可以第二種方式創(chuàng)建根視圖控制器。

XIB的類關(guān)聯(lián)和對(duì)象創(chuàng)建

XIB的類管理,大家要認(rèn)清一點(diǎn),那個(gè)是控制器,那個(gè)是視圖。認(rèn)清這一點(diǎn),XIB的關(guān)聯(lián)就不會(huì)有問題。
那么現(xiàn)在咱們舉幾個(gè)例子,讓大家明白如何關(guān)聯(lián)類。

關(guān)聯(lián)viewcontroller。

創(chuàng)建一個(gè)類,如圖34-1所示:

圖34-1

勾選選項(xiàng)卡,系統(tǒng)就會(huì)給我們創(chuàng)建好直接關(guān)聯(lián)好的可視化文件。
那么現(xiàn)在我們不勾選,自己來關(guān)聯(lián)。如何來關(guān)聯(lián)UIViewcontroller。
我們選創(chuàng)建一個(gè)類,然后如圖34-2所示:


圖34-2

然后生成一個(gè)可視化文件來進(jìn)行關(guān)聯(lián)。如圖34-2所示:

圖34-2

然后給定可視化文件的名字,這里的名字是可以隨便起的,但是在開發(fā)過程中,一般會(huì)和類文件保持名字一致,方便以后的管理。如圖34-3所示:

圖34-3

然后進(jìn)行類關(guān)聯(lián)。大家認(rèn)真看,左側(cè)欄的選項(xiàng)卡,有2個(gè)非常重要的東西,一個(gè)叫File’s Owner 另外一個(gè)是View 如圖34-4所示:

圖34-4

注意:File’s Owner就是控制器, View就是視圖。
一定記住File’s Owner就是控制器,這個(gè)前提,你就不會(huì)關(guān)聯(lián)錯(cuò)文件。
我們現(xiàn)在去關(guān)聯(lián)。我們要關(guān)聯(lián)的類是一個(gè)viewcontroller。也就說,是個(gè)控制器。那么現(xiàn)在,我們的需要關(guān)聯(lián)的類就應(yīng)該選中File’s Owner。然后進(jìn)行關(guān)聯(lián)。如圖34-5所示:

圖34-5

然后,我們現(xiàn)在來理解這個(gè)view,這個(gè)view就是我們viewcontroller中的self.view。那我們需要把視圖給我們的File’s Owner指定。如圖34-6所示:

圖34-6

從File’s Owner按住control往View身上拽。然后選擇View。這樣,viewcontroller中的view就是我們可視化xib文件中的View了。如圖34-7所示:

圖34-7

ViewController對(duì)象的XIB創(chuàng)建

#import "TestViewController.h"
TestViewController *testVC = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];

這里的NibName是XIB的文件名字,如圖34-8所示:

圖34-8

UITableViewController的類關(guān)聯(lián)

然后我們做一個(gè)類似的UITableViewController關(guān)聯(lián)。
創(chuàng)建一個(gè)UITableViewController的類如圖35-1所示:

圖35-1

然后創(chuàng)建一個(gè)可視化文件進(jìn)行關(guān)聯(lián)。如圖35-2所示:

圖35-2

進(jìn)行類關(guān)聯(lián)。我們想想看,應(yīng)該點(diǎn)擊那個(gè)進(jìn)行關(guān)聯(lián)類,是view 還是File’s Owner?
UITableViewController也是視圖控制器,所以我們一定要選擇File’s Owner再進(jìn)行關(guān)聯(lián)。如圖35-3所示:

圖35-3

然后接著想,UITableViewController的view是個(gè)什么?是View 還是 Tableview?沒錯(cuò),就是tableview,所以我們要要把View刪了。拖拽一個(gè)tableview再指定視圖。如圖35-4所示:
選中View刪除。然后拖拽Tableview

圖35-4

然后和之前一樣,tableview成為File’s Owner的視圖。如圖35-5所示:

圖35-5

然后,UITableViewController是實(shí)現(xiàn)了tableview的代理方法的,我們需要把tableview的代理設(shè)置下。然后大家想想我們的tableview指定代理代碼是不是 tableView.dataSource = self;這樣指定的,這里的self是不是就是我們TestTableViewController本身。然后我們的File’s Owner是什么?是不是視圖控制器。也就是我們的self。所以,這里指定代理。選中View右鍵,然后拖拽到File’s Owner上。如圖35-6所示:

圖35-6

同理也Delegate也指定下吧。這樣我們的UITableViewController的類關(guān)聯(lián)就完成了。

![Uploading 22ACD3F9-A157-4D6F-AF68-8BCE58F97218_745948.png . . .]UITableViewController對(duì)象XIB的創(chuàng)建

#import "TestTableViewController.h"
TestTableViewController *testTVC = [[TestTableViewController alloc] initWithNibName:@"TestTableViewController" bundle:nil];

這里的NibName也是XIB文件的名字。同上。

UITableViewCell的類關(guān)聯(lián)

UITableViewCell我們?cè)陂_發(fā)中,用的比較多。一般都會(huì)選中勾選XIB,讓系統(tǒng)幫我們創(chuàng)建,這里我看看如何進(jìn)行類的關(guān)聯(lián)。
創(chuàng)建一個(gè)UITableViewCell的類。這里不再演示,我們直接從關(guān)聯(lián)開始。如圖36-1所示:

圖36-1

然后我們的Cell中的視圖是我們的UITableViewCell,所以,我們把View可視化文件刪掉,拖拽一個(gè)UITableViewCell上去。如圖36-2所示:

圖36-2

然后進(jìn)行類關(guān)聯(lián),我們想想這里我們關(guān)聯(lián)那個(gè)文件,是File’s Owner還是可視化文件TableViewCell。UITableViewCell是不是控制器。答案是否,他是個(gè)視圖,所以這里關(guān)聯(lián)類,我們要選擇可視化文件View來進(jìn)行關(guān)聯(lián),如圖36-3所示:

圖36-3

UITableViewCell的對(duì)象創(chuàng)建

UITableViewCell和其他的視圖不太一樣,UITableViewCell都是要靠重用機(jī)制的,這里我只提示一點(diǎn)。storybord中的cell我們可以通過免注冊(cè)的方式。先讓tableView顯示一條Cell如圖37-1所示:

圖37-1

然后點(diǎn)擊cell 進(jìn)行類的關(guān)聯(lián),通過identifier就可以免去cell的注冊(cè)。如圖37-2所示:

圖37-2

如果你在storyboard中沒有使用cell,想通過xib的cell進(jìn)行使用的話,cell需要進(jìn)行注冊(cè)。
代碼如下:

#import “TestTableViewCell.h"
  [tableView registerNib:[UINib nibWithNibName:@"TestTableViewCell" bundle:nil] forCellReuseIdentifier:@"cell"];

NibName依然是我們xib文件代碼名字。
純代碼方式的cell注冊(cè),這里不再介紹。

Storyboard的傳值

在我們開發(fā)過程中,經(jīng)常有一些屬性傳值的情況,而Storyboard是可以直接進(jìn)行類的跳轉(zhuǎn)的。所以會(huì)有一些傳值問題。這里主要講解一個(gè)方法。2個(gè)例子給大家講解。
例子1
一個(gè)按鈕點(diǎn)擊進(jìn)入到二級(jí)界面。這里我選擇了show,如圖38-1所示:

圖38-1

這樣點(diǎn)擊Button就直接進(jìn)入到二級(jí)頁面了,可是這個(gè)時(shí)候,我們沒有寫代碼,也就意味著,我們傳值沒有辦法實(shí)現(xiàn)了,可視化編程傳值,是需要通過一個(gè)方法的。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

如果你的視圖控制器中不存在這個(gè)方法,大家可以把他敲出來。
我們說明下這個(gè)方法的參數(shù)。如圖38-2所示:

圖38-2

sender就是指的是點(diǎn)擊那個(gè)空間點(diǎn)擊進(jìn)入二級(jí)頁面的。segue指的就是那根連接的線。

segue常用的屬性

segue.sourceViewController(一級(jí)界面的控制器或者上個(gè)控制器)
segue.destinationViewController(二級(jí)界面的控制器或者下個(gè)控制器)
segue.identifier(標(biāo)記。用來區(qū)分是那條線。我們后面講這個(gè)用處。)

可以根據(jù)segue.sourceViewController和segue.destinationViewController來完成傳值的效果。這里不再演示。接著我們來講解identifier的用處
例子2
有一個(gè)cell,根據(jù)某個(gè)值點(diǎn)金讓跳轉(zhuǎn)到不同的2個(gè)viewcontroller。我們這里拖拽cell就不能實(shí)現(xiàn)連接2條線了。拖拽cell只能連接一條線。不能完成2條線。如圖38-3所示:

圖38-3

同理我們?cè)偻献б粭l到另外一個(gè)VC。實(shí)現(xiàn)效果如圖38-4所示:

圖38-4

之后,我們需要在cell點(diǎn)擊的代理方法中,讓他進(jìn)入到不同的線,進(jìn)入到不同的VC頁面。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (YES) {
        [self performSegueWithIdentifier:@"fistVC" sender:nil];
    }else{
        [self performSegueWithIdentifier:@"secondVC" sender:nil];

    }
}

這里的performSegueWithIdentifier方法就是讓我們的可視化編程進(jìn)入到不同的線,我這里有2條線,給定不同的標(biāo)識(shí),這樣我就可以控制cell,讓他調(diào)用不同的線,進(jìn)入到不同的VC界面。
那么這里的Identifier是在哪設(shè)置的呢。如圖38-5所示:

圖38-5

一定要先點(diǎn)擊其中的一條線,再設(shè)置Identifier。同理,把另外一條Identifier設(shè)置成secondVC。這里的Identifier就是我們的segue.identifier。
然后在可視化編程跳轉(zhuǎn)的方法中做其他的設(shè)置。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"firstVC"]) {
        NSLog(@"傳值到第一個(gè)頁面");
    }else{
        NSLog(@"傳值到第二個(gè)頁面");
    }
}

可視化編程就此結(jié)束,如果有其他疑問,大家可以在留言區(qū)留言,我會(huì)及時(shí)回復(fù)大家,如果有必要我會(huì)再補(bǔ)充。

如果這系列文章有幫助到你,可以點(diǎn)個(gè)贊or加個(gè)關(guān)注。我會(huì)持續(xù)更新其他的內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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