加載控制器的View一共有六種方式合冀,本篇介紹的是其中的一種---加載與控制器同名去掉Controller后綴的View。
假設(shè)有一個視圖控制器叫做MGSimpleViewController
身腻,如果通過以下方式創(chuàng)建,那么會加載什么View
作為視圖控制器的根View呢?
MGSimpleViewController *vc = [[MGSimpleViewController alloc] init];
通過這行代碼并不能確切知道創(chuàng)建出來的View是什么樣子的分歇,具體還得看以下幾個點:
- 控制器實現(xiàn)文件是否覆蓋
-(void)loadView
并且在方法中設(shè)置了self.view = xxView
状您,如果是勒叠,那么視圖控制器的View
就是xxView
兜挨,如果否,那么進入第2點眯分。 - 工程目錄下是否存在一個叫做
MGSimpleView.xib
的文件拌汇,如果是,那么這個MGSimpleView.xib
中指定的View
就是視圖控制器的View
弊决,如果否噪舀,那么進入第3點。 - 工程目錄下是否存在一個叫做
MGSimpleViewController.xib
的文件飘诗,如果是与倡,那么這個MGSimpleViewController.xib
中指定的View
就是視圖控制器的View
,如果否疚察,那么進入第4點蒸走。 - 視圖控制器自己創(chuàng)建一個空白的
View
對象,并且將其作為根視圖貌嫡,可以通過self.view
進行訪問比驻。
除了上面4種還有另外2種方法,一種是通過加載SB文件岛抄,另一種是加載其它名字的Xib文件别惦,創(chuàng)建一個視圖控制器的根View
一共就這六種方法(還有一種說法---七種,把-(void)loadView
中不同的加載方式當做不同的創(chuàng)建方法夫椭,比如通過Xib和通過SB掸掸,但這里我就且當作一種)。
說完總的創(chuàng)建方法之后蹭秋,現(xiàn)在只拎上面的第2種方法介紹一下扰付,因為這種創(chuàng)建方式其實有不少需要注意的地方。
- 首先創(chuàng)建目標控制器
2.創(chuàng)建同名去掉Controller仁讨,繼承自UIView的頭文件和實現(xiàn)文件
3.由于父類是UIView羽莺,所以無法在創(chuàng)建的時候順便創(chuàng)建XIB,所以我們手動創(chuàng)建同名的XIB
4.重點來了
上面的是將
MGSimpleView.h\.m
和MGSimpleView.xib
的文件關(guān)聯(lián)起來洞豁,這里應該都理解盐固,進入下一步
這步操作的意義是,給
MGSimpleView.xib
這個文件設(shè)置它的擁有者(視圖控制器)所以圖中第3點填的是視圖控制器丈挟,而不是視圖刁卜!通過上面的兩張圖片的操作,現(xiàn)在編譯器知道在加載MGSimpleViewController
的時候去MGSimpleView.xib
中尋找合適的View
作為控制器的根View
曙咽,并且編譯器也知道了MGSimpleView.xib
關(guān)聯(lián)的是MGSimpleView.h\.m
文件蛔趴。但是一個
XIB
文件中可以存在多個一級視圖,所以我們在通過UINIB
加載XIB
文件的時候是這樣寫的:
NSArray *views = [[UINib nibWithNibName:@"MGXxView" bundle:nil] instantiateWithOwner:nil options:nil];
MGXxView *xxView = views[index];
所以到現(xiàn)在為止例朱,編譯器還不知道要MGSimpleView.xib
中的哪個View
夺脾,如果這個時候運行的話之拨,會出現(xiàn)下面的錯誤:
-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "MGSimpleView" nib but the view outlet was not set
這段反饋信息的意思是我們沒有設(shè)置MGSimpleView
中的view outlet
的關(guān)聯(lián)對象茉继,因為沒有這個對象咧叭,編譯器就不知道要加載MGSimpleView.xib
中的哪一個View
作為MGSimpleViewController
的根view
,所以還差最后一個步奏烁竭。
通過上面的操作菲茬,現(xiàn)在編譯器就知道去找MGSimpleView.xib
中view outlet
關(guān)聯(lián)的那個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");
}
這種風格應該不會陌生派撕,因為UITableViewController和UITableView之間的實現(xiàn)就是這種婉弹,代碼風格也是一致。