- 1.当控件不是从xib、storyboard中创建时,会调用这个方法
//纯代码调用初始化一定会调用的类
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self addGesture];
}
return self;
}
- 当控件是从xib、storyboard中创建时,就会调用这个方法。
// xib 这个方法只是有了self 而self内部的控件还是nil
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self addGesture];
}
return self;
}
/// xib 这个方法只是有了self 而self内部的控件也已经存在
- (void)awakeFromNib
{
[super awakeFromNib];
[self addGesture];
}
这个方法在initWithCoder:方法后调用 ,顺序是:initWithCoder -> awakeFromNib
- 总结
1、在viewDidLoad之前,由于是storyboard上创建的类,会先执行好,且会顺序走 initWithCoder、awakeFromNib两个方法
2、到viewDidLoad之后,执行到用代码创建的view,只会走 initWithFrame 方法
最后总结:
1、initWithFrame只适用纯代码创建时调用,不涉及xib或storyboard。
2、initWithCoder、awakeFromNib是从xib、storyboard中创建时会调用。
3、所以一般来说,为了安全起见,初始化控件的代码我们写在一个方法里面(类似我上面的initViews方法),然后我们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起到作用。
网友评论