init方法与xib区别

控件的创建

  • 在编写第三方框架时,外界使用时创建一个控件有两种方法:

  • 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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,143评论 25 709
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,241评论 30 472
  • 很多朋友如果是初学iOS开发,可能会被其中的几个加载方法给搞得晕头转向的,但是这几个方法又是作为iOS程序员必须要...
    Jackie_123阅读 3,450评论 4 18
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,515评论 2 4
  • 这个题目,来自朱利安。他昨天写了一篇文章就叫《恋物癖》,写完后第一时间发给我看,让我给他一些意见。那篇文章,我觉得...
    imorange阅读 348评论 0 0