相信大部分接觸過xib與storyboard的開發(fā)者都對(duì)倆者描述控件贊不絕口,倆者的出現(xiàn)大大降低了開發(fā)者開發(fā)的時(shí)間,不用在設(shè)置UI浪費(fèi)大量的時(shí)間和維護(hù)臃腫的代碼,本文來(lái)說一說用代碼實(shí)例化對(duì)象和xib實(shí)例化對(duì)象系統(tǒng)調(diào)用方法的不同
用代碼實(shí)例化對(duì)象
- 對(duì)于用代碼實(shí)例化一個(gè)控件(CustomView)所需要的代碼如下
CustomView *customView = [[CustomView alloc] init];
- 此時(shí)系統(tǒng)會(huì)調(diào)用對(duì)象的init方法,如果開發(fā)者需要在對(duì)象初始化時(shí)給對(duì)象的屬性賦值就在對(duì)象的init方法中寫入即可,如下圖
- (instancetype)init
{
if (self = [super init]) {
self.backgroundColor = [UIColor blueColor];
self.alpha = 0.5f;
self.shopsLabel.text = @"商品";
}
return self;
}
需要注意如果創(chuàng)建對(duì)象是通過initWithFrame方法是不會(huì)調(diào)用init方法
的,系統(tǒng)會(huì)自動(dòng)調(diào)用initWithFrame方法,而通過init方法創(chuàng)建對(duì)象也
會(huì)調(diào)用initWithFrame方法
通過xib加載對(duì)象
- 用xib實(shí)例化對(duì)象方法
需要注意Xib的文件名最好與文件的名字相同
[[[NSBundle mainBundle] loadNibNamed:@"CustomView"
owner:nil options:nil] lastObject];
- 此時(shí)系統(tǒng)會(huì)自動(dòng)調(diào)用initWithCoder:aDecoder方法來(lái)初始化對(duì)象,而此時(shí)如果在initWithCoder:方法中設(shè)置對(duì)象屬性
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
self.backgroundColor = [UIColor blueColor];
self.alpha = 0.5f;
self.shopLabel.text = @"商品";
}
return self;
}
- 此時(shí)會(huì)發(fā)現(xiàn)對(duì)內(nèi)部shopLabel.text設(shè)置沒有作用。因?yàn)閷?duì)象內(nèi)部控件還沒有實(shí)例化(也就是還沒有被連線)需要在Xib文件加載完畢后才可以設(shè)置,解決方法是在awakeFromNib設(shè)置參數(shù)屬性,如下圖
- (void)awakeFromNib
{
self.shopLabel.text = @"商品";
}