xib基本使用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值