加载xib文件

// Test.xib --编译--> Test.nib
    // 方式1
    NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"Test" owner:nil options:nil];
    [self.view addSubview:objs[3]];//3代表控件再Test.xib中的位置顺序
// 方式2
    // 一个UINib对象就代表一个xib文件
//    UINib *nib = [UINib nibWithNibName:@"Test" bundle:[NSBundle mainBundle]];
    // 一般情况下,bundle参数传nil,默认就是mainBundle
    UINib *nib = [UINib nibWithNibName:@"Test" bundle:nil];
    NSArray *objs = [nib instantiateWithOwner:nil options:nil];
    [self.view addSubview:objs[2]];//2代表控件再Test.xib中的位置顺序 
//加载xib文件的初始化方式:
//该初始化方式 不能访问子视图的子视图
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self=[super initWithCoder:aDecoder];
    if (self) {
        NSLog(@"~~~~@");
    }
    return self;
}
//最好用这种方式
-(void)awakeFromNib
{
    NSLog(@"~~~~!");
}

一个控件有2种创建方式
通过代码创建
初始化时一定会调用initWithFrame:方法

通过xibstoryboard创建
初始化时不会调用initWithFrame:方法,只会调用initWithCoder:方法
初始化完毕后会调用awakeFromNib方法

有时候希望在控件初始化时做一些初始化操作,比如添加子控件、设置基本属性
这时需要根据控件的创建方式,来选择在initWithFrame:、initWithCoder:、awakeFromNib的哪个方法中操作

原文地址:https://www.cnblogs.com/jingdizhiwa/p/5614541.html