1.关于xib创建控件以及代码创建控件走的方法

  • 1.当控件不是从xib、storyboard中创建时,会调用这个方法

//纯代码调用初始化一定会调用的类
- (instancetype)initWithFrame:(CGRect)frame
{

    self = [super initWithFrame:frame];
    if (self) {
        [self addGesture];
    }
    return self;
}

    1. 当控件是从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. 总结

1、在viewDidLoad之前,由于是storyboard上创建的类,会先执行好,且会顺序走 initWithCoder、awakeFromNib两个方法

2、到viewDidLoad之后,执行到用代码创建的view,只会走 initWithFrame 方法

最后总结:

1、initWithFrame只适用纯代码创建时调用,不涉及xib或storyboard。

2、initWithCoder、awakeFromNib是从xib、storyboard中创建时会调用。

3、所以一般来说,为了安全起见,初始化控件的代码我们写在一个方法里面(类似我上面的initViews方法),然后我们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起到作用。

你可能感兴趣的:(1.关于xib创建控件以及代码创建控件走的方法)