xib文件在编译的后会变成nib文件
xib文件.png
NSArray * xibArray = [[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil] ;
return xibArray[0];
UINib *nib = [UINib nibWithNibName:NSStringFromClass(self) bundle:nil];
NSArray *xibArray = [nib instantiateWithOwner:nil options:nil];
return xibArray[0];
xibArray中log打印:
log打印
点击"File‘s Owner",设置Class为xxxViewControler
Files‘s Owner与View做关联
CustomViewController *custom = [[CustomViewController alloc]initWithNibName:@"CustomViewController" bundle:nil];
CustomViewController *custom = [[CustomViewController alloc]initWithNibName:nil bundle:nil];
第一步:寻找有没有和控制器类名同名的xib,如果有就去加载(XXViewController.xib)
控制器类名同名的xib
第二步:寻找有没有和控制器类名同名但是不带Controller的xib,如果有就去加载(XXView.xib)
和控制器类名同名但是不带Controller的xib
第三步:如果没有找到合适的xib,就会创建一个View(白色View,为系统自己创建的)
这是自定义的一个View,我们通过不同的初始化方式去判断它的执行方法
#import "CustomViw.h"
@implementation CustomViw
- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"%s",__func__);
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
NSLog(@"%s",__func__);
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super initWithCoder:aDecoder]) {
}
NSLog(@"%s",__func__);
return self;
}
- (void)awakeFromNib{
[super awakeFromNib];
NSLog(@"%s",__func__);
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CustomViw *customView = [[CustomViw alloc] init];
}
@end
log打印
通过init方法初始化自定义控件log打印
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CustomViw *customView = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([CustomViw class]) owner:nil options:nil] lastObject];
}
@end
log打印(打印三次是因为CustomViw的xib文件里有三个View)
通过加载xib方法初始化自定义控件log打印
代码实验结论:
通过代码初始化自定义控件是不会自动加载xib的,它会执行initWithFrame
和init
通过加载xib初始化自定义控件,仅仅执行 initWithCoder
和awakeFromNib
,如果要通过代码修改xib的内容,一般建议放在awakeFromNib
方法内
一般封装一个控件,为了让开发者方便使用,通常会在自定义的控件中编写俩个方法初始化方法,这样不管是通过init
还是加载xib都可以实现相同的效果
#import "CustomViw.h"
@implementation CustomViw
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
}
- (void)awakeFromNib{
[super awakeFromNib];
[self setup];
}
- (void)setup{
[self setBackgroundColor:[UIColor redColor]];
}
@end