「这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战」
关于 xib 或 storyboard
- 共同点
- 都用来描述软件界面
- 都用 interface builder 工具来编辑
- 本质都是转换成代码去创建控件
- 不同点
- xib是轻量级的,用来描述局部UI界面
- storyboard是重量级的,用来描述整个软件的多个界面,并且能够展示多个界面的跳转关系
加载xib
xib 文件在编译的后会变成 nib 文件
- 第一种加载方式
NSArray * xibArray = [[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil] ; return xibArray[0]; 复制代码
- 第二种加载方式
xibArray中log打印UINib *nib = [UINib nibWithNibName:NSStringFromClass(self) bundle:nil]; NSArray *xibArray = [nib instantiateWithOwner:nil options:nil]; return xibArray[0]; 复制代码
控制器加载xib
-
首先需要对 xib 文件进行一些处理,打开 xib 文件
-
点击 "File‘s Owner",设置 Class 为 xxxViewControler
-
右键 "Files‘s Owner",里面有个默认的IBOutlet变量view,看一下后面有没有做关联,如果没有就拉到下面的View和视图做个关联
-
第一种加载方式,传入指定的 xib(如CustomViewController)
CustomViewController *custom = [[CustomViewController alloc]initWithNibName:@"CustomViewController" bundle:nil]; 复制代码
-
第二种加载方式,不指定 xib
CustomViewController *custom = [[CustomViewController alloc]initWithNibName:nil bundle:nil]; 复制代码
-
第一步:寻找有没有和控制器类名同名的xib,如果有就去加载(XXViewController.xib)
-
第二步:寻找有没有和控制器类名同名但是不带Controller的xib,如果有就去加载(XXView.xib)
-
第三步:如果没有找到合适的 xib,就会创建一个
view
(白色View,为系统自己创建的)
-
xib自定义控件与代码自定义的区别
这是自定义的一个 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
复制代码
-
通过
init
方法初始化自定义控件@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CustomViw *customView = [[CustomViw alloc] init]; } @end 复制代码
log:
-
通过加载 xib 方法初始化自定义控件
@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的,它会执行
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
复制代码