相信大部分接触过xib与storyboard的开发者都对俩者描述控件赞不绝口,俩者的出现大大降低了开发者开发的时间,不用在设置UI浪费大量的时间和维护臃肿的代码,本文来说一说用代码实例化对象和xib实例化对象系统调用方法的不同
用代码实例化对象
- 对于用代码实例化一个控件(CustomView)所需要的代码如下
CustomView *customView = [[CustomView alloc] init];
- 此时系统会调用对象的init方法,如果开发者需要在对象初始化时给对象的属性赋值就在对象的init方法中写入即可,如下图
- (instancetype)init
{
if (self = [super init]) {
self.backgroundColor = [UIColor blueColor];
self.alpha = 0.5f;
self.shopsLabel.text = @"商品";
}
return self;
}
需要注意如果创建对象是通过initWithFrame方法是不会调用init方法
的,系统会自动调用initWithFrame方法,而通过init方法创建对象也
会调用initWithFrame方法
通过xib加载对象
- 用xib实例化对象方法
需要注意Xib的文件名最好与文件的名字相同
[[[NSBundle mainBundle] loadNibNamed:@"CustomView"
owner:nil options:nil] lastObject];
- 此时系统会自动调用initWithCoder:aDecoder方法来初始化对象,而此时如果在initWithCoder:方法中设置对象属性
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
self.backgroundColor = [UIColor blueColor];
self.alpha = 0.5f;
self.shopLabel.text = @"商品";
}
return self;
}
- 此时会发现对内部shopLabel.text设置没有作用。因为对象内部控件还没有实例化(也就是还没有被连线)需要在Xib文件加载完毕后才可以设置,解决方法是在awakeFromNib设置参数属性,如下图
- (void)awakeFromNib
{
self.shopLabel.text = @"商品";
}