init方法与xib区别
2016-04-16 本文已影响436人
letaibai
控件的创建
-
在编写第三方框架时,外界使用时创建一个控件有两种方法:
-
1.init方法
-
2.xib自定义
不管是以哪种方法创建,系统底层会调用一些方法来初始化控件,那么该在哪种方法创建时调用对应的初始化方法来设置控件的属性呢?以UILabel举例. -
init方法:
// init创建
DLLabel *dlLabel = [[DLLabel alloc] init];// DL为类前缀(classprefix)
//initWithFrame:创建
DLLabel *dlLabel = [[DLLabel alloc] initWithFrame:CGRect];
*不管是使用init方法还是initWithFrame:方法创建控件时,系统底层都会调用initWithFrame:方法.所以可以统一在initWithFrame:方法中重写控件的初始化属性.*
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
//initialize code
}
return self;
}
- xib自定义控件
在通过xib自定义控件时,一般会提供类工厂方法
// .h文件
+ (instancetype)label;
// .m文件
+ (instancetype)label{
//加载DLLabel类型的xib文件
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
}
创建时如下:
DLLabel *label = [DLLabel label];
在使用类方法创建控件时,系统底层会调用initWithCoder:方法,另外在xib控件创建完成时调用awakeFromNib方法.所以想初始化控件需要写在以下方法中.
// 当控件加载完成之前调用
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
//initialize code
return self;
}
// 当控件加载完成之后调用
- (void)awakeFromNib{
//initialize code
}
为了保证通过两种方式都能调用初始化代码,可将初始化代码单独抽出到方法中,然后在以上方法中分别调用一次即可.
即:
// 在初始化方法中通过[self initialize]来调用
- (void)initialize{
//initialize code
}