加載控制器同名去掉Controller后綴的View

加載控制器的View一共有六種方式,本篇介紹的是其中的一種---加載與控制器同名去掉Controller后綴的View。

假設(shè)有一個(gè)視圖控制器叫做MGSimpleViewController,如果通過以下方式創(chuàng)建,那么會(huì)加載什么View作為視圖控制器的根View呢?

MGSimpleViewController *vc = [[MGSimpleViewController alloc] init];

通過這行代碼并不能確切知道創(chuàng)建出來的View是什么樣子的,具體還得看以下幾個(gè)點(diǎn):

  1. 控制器實(shí)現(xiàn)文件是否覆蓋-(void)loadView并且在方法中設(shè)置了self.view = xxView,如果是,那么視圖控制器的View就是xxView,如果否,那么進(jìn)入第2點(diǎn)。
  2. 工程目錄下是否存在一個(gè)叫做MGSimpleView.xib的文件,如果是,那么這個(gè)MGSimpleView.xib指定的View就是視圖控制器的View,如果否,那么進(jìn)入第3點(diǎn)。
  3. 工程目錄下是否存在一個(gè)叫做MGSimpleViewController.xib的文件,如果是,那么這個(gè)MGSimpleViewController.xib指定的View就是視圖控制器的View,如果否,那么進(jìn)入第4點(diǎn)。
  4. 視圖控制器自己創(chuàng)建一個(gè)空白的View對象,并且將其作為根視圖,可以通過self.view進(jìn)行訪問。

除了上面4種還有另外2種方法,一種是通過加載SB文件,另一種是加載其它名字的Xib文件,創(chuàng)建一個(gè)視圖控制器的根View一共就這六種方法(還有一種說法---七種,把-(void)loadView中不同的加載方式當(dāng)做不同的創(chuàng)建方法,比如通過Xib和通過SB,但這里我就且當(dāng)作一種)。


說完總的創(chuàng)建方法之后,現(xiàn)在只拎上面的第2種方法介紹一下,因?yàn)檫@種創(chuàng)建方式其實(shí)有不少需要注意的地方。

  1. 首先創(chuàng)建目標(biāo)控制器
Snip20170227_122.png

2.創(chuàng)建同名去掉Controller,繼承自UIView的頭文件和實(shí)現(xiàn)文件

Snip20170227_123.png

3.由于父類是UIView,所以無法在創(chuàng)建的時(shí)候順便創(chuàng)建XIB,所以我們手動(dòng)創(chuàng)建同名的XIB

Snip20170227_124.png
4.重點(diǎn)來了

Snip20170227_127.png

上面的是將MGSimpleView.h\.mMGSimpleView.xib的文件關(guān)聯(lián)起來,這里應(yīng)該都理解,進(jìn)入下一步

Snip20170227_126.png

這步操作的意義是,給MGSimpleView.xib這個(gè)文件設(shè)置它的擁有者(視圖控制器)所以圖中第3點(diǎn)填的是視圖控制器,而不是視圖!通過上面的兩張圖片的操作,現(xiàn)在編譯器知道在加載MGSimpleViewController的時(shí)候去MGSimpleView.xib中尋找合適的View作為控制器的根View,并且編譯器也知道了MGSimpleView.xib關(guān)聯(lián)的是MGSimpleView.h\.m文件。
但是一個(gè)XIB文件中可以存在多個(gè)一級(jí)視圖,所以我們在通過UINIB加載XIB文件的時(shí)候是這樣寫的:

NSArray *views = [[UINib nibWithNibName:@"MGXxView" bundle:nil] instantiateWithOwner:nil options:nil];

MGXxView *xxView = views[index];

所以到現(xiàn)在為止,編譯器還不知道要MGSimpleView.xib中的哪個(gè)View,如果這個(gè)時(shí)候運(yùn)行的話,會(huì)出現(xiàn)下面的錯(cuò)誤:

-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "MGSimpleView" nib but the view outlet was not set

這段反饋信息的意思是我們沒有設(shè)置MGSimpleView中的view outlet的關(guān)聯(lián)對象,因?yàn)闆]有這個(gè)對象,編譯器就不知道要加載MGSimpleView.xib中的哪一個(gè)View作為MGSimpleViewController根view,所以還差最后一個(gè)步奏。

Snip20170227_128.png

通過上面的操作,現(xiàn)在編譯器就知道去找MGSimpleView.xibview outlet關(guān)聯(lián)的那個(gè)UIView控件作為視圖控制器的根view。MGSimpleViewControll.m可以這樣寫:

#import "MGSimpleViewController.h"
#import "MGSimpleView.h"

@interface MGSimpleViewController ()<MGSimpleViewDelegate,MGSimpleViewDataSource>
@property(nonatomic,weak)MGSimpleView *simpleView;
@end

@implementation MGSimpleViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.simpleView = (MGSimpleView *)self.view;
    self.simpleView.delegate = self;
    self.simpleView.dataSource = self;
}

#pragma mark - MGSimpleViewDataSource
-(NSDictionary *)requestParamsWithSimpleView:(MGSimpleView *)simpleView{
    return @{@"username" : @"Mango"};
}

#pragma mark - MGSimpleViewDelegate
-(void)simpleView:(MGSimpleView *)simpleView didClickRegisterBtn:(UIButton *)registerBtn{
    NSLog:(@"register");
}

這種風(fēng)格應(yīng)該不會(huì)陌生,因?yàn)閁ITableViewController和UITableView之間的實(shí)現(xiàn)就是這種,代碼風(fēng)格也是一致。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容