Xib和storyBorad区别和共同点
共同点:
1.都用来描述软件界面
2.都用Interface Builder工具来编译
3.本质都是转换成代码去创建控件
不同点:
1.Xib是轻量级的,用来描述局部的UI界面
2.Storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系
加载Xib
//ViewController.h
@interface ViewController ()
@end
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
//展示Xib
方法1:
NSArray *views = [NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil];
UIView *carView = [views firstObject];
[self.view addSubview:carView];
方法2:
UINib *nib = [UINib nibWithNibName:@"xib文件名" bundle:nil];
NSArray *views = [nib instantiateWithOwner:nil options:nil];
}
@end
使用Xib加载子控件时需要先唤醒
//xib对应的shopView.h
@interface shopView : UIView
-(void)setImage:(NSString *)imageName;
-(void)setTitle:(NSString *)title;
@end
//xib对应的shopView.m
@interface shopView ()
//连线
@property (nonatomic,weak) UIImageView *imageView;
@property (nonatomic,weak) UILabel *titleLabel;
@end
@implementation shopView
-(void)setImage:(NSString *)imageName{
self.imageView.image = [UIImage imageNamed:imageName];
}
-(void)setTitle:(NSString *)title{
self.titleLabel.text = title;
}
@end
//ViewController.m
@interface ViewController ()
@end
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
//加载Xib
shopView *shopView = [[NSBundle mainBundle] loadNibName:@"xib文件名" owner:nil optional:nil];
[shopView setImage:@"123"];
[shopView setTitle:@"title"];
[self.view addSubview:shopView];
}
@end
提供快速创建方法:
//xib对应的XibShopView.h
@interface XibShopView: UIView
-(void)setImage:(NSString *)imageName;
-(void)setTitle:(NSString *)title;
+(instancetype)shopView;
@end
//xib对应的shopView.m
@interface XibShopView ()
//连线
@property (nonatomic,weak) UIImageView *imageView;
@property (nonatomic,weak) UILabel *titleLabel;
@end
@implementation XibShopView
//如果是view从xib中加载,就会调用当前的方法,不会调用init方法和initWithFrame方法
//注意:如果子控件是从xib中创建的,是处于未唤醒状态
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if(self = [super initWithCoder:aDecodet])}{
//初始化代码,相当于代码创建子控件中的init和initWithFrame方法,用来创建一些子控件
}
return self;
}
//从xib中唤醒
//添加xib中创建的子控件的子控件
-(void)awakeFromXib{
}
//布局子控件
-(void)layoutSubviews{
[super layoutSubviews];
//布局子控件
}
-(void)setImage:(NSString *)imageName{
self.imageView.image = [UIImage imageNamed:imageName];
}
-(void)setTitle:(NSString *)title{
self.titleLabel.text = title;
}
+(instancetype)shopView{
NSArray *UIViews = [[NSBundle mainBundle] loadNibNamed:@"shopView" owner:nil optional:nil];
return [UIViews lastObject];
}
@end
//ViewController.m
@interface ViewController ()
@end
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
//加载Xib
shopView *shopView = [XibShopView shopView];
[shopView setImage:@"123"];
[shopView setTitle:@"title"];
[self.view addSubview:shopView];
}
@end
注意:
1.如果一个view从xib中加载,就不能用[[xxx alloc] init] 和 [[xxx alloc] initWithFrame:frame]创建
2.如果一个xib经常被使用,应该提供构造方法
3.如果一个view从xib中加载:
用代码添加一些子控件,得在initWithCoder:和awakeFromNib创建
4.如果一个view从xib中加载,不会调用init和initWithFrame方法
5.同时存在initWithCoder和awakeFromNib时,会先调用initWithCoder,再调用awakeFromNib