加載控制器的View一共有六種方式,本篇介紹的是其中的一種---加載與控制器同名去掉Controller后綴的View。
假設(shè)有一個(gè)視圖控制器叫做MGSimpleViewController,如果通過以下方式創(chuàng)建,那么會(huì)加載什么View作為視圖控制器的根View呢?
MGSimpleViewController *vc = [[MGSimpleViewController alloc] init];
通過這行代碼并不能確切知道創(chuàng)建出來的View是什么樣子的,具體還得看以下幾個(gè)點(diǎn):
- 控制器實(shí)現(xiàn)文件是否覆蓋
-(void)loadView并且在方法中設(shè)置了self.view = xxView,如果是,那么視圖控制器的View就是xxView,如果否,那么進(jìn)入第2點(diǎn)。 - 工程目錄下是否存在一個(gè)叫做
MGSimpleView.xib的文件,如果是,那么這個(gè)MGSimpleView.xib中指定的View就是視圖控制器的View,如果否,那么進(jìn)入第3點(diǎn)。 - 工程目錄下是否存在一個(gè)叫做
MGSimpleViewController.xib的文件,如果是,那么這個(gè)MGSimpleViewController.xib中指定的View就是視圖控制器的View,如果否,那么進(jìn)入第4點(diǎn)。 - 視圖控制器自己創(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í)有不少需要注意的地方。
- 首先創(chuàng)建目標(biāo)控制器

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

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

4.重點(diǎn)來了

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

這步操作的意義是,給
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è)步奏。

通過上面的操作,現(xiàn)在編譯器就知道去找MGSimpleView.xib中view 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)格也是一致。