xib
Xib和storyboard对比
<<< 共同点 >>>
- 都用来描述软件界面
- 都用Interface Builder工具来编辑
- 本质都是转换成代码去创建软件
<<<不同点>>>
- xib是轻量级,用来描述局部UI界面
- Storyboard是重量级,用来描述整个软件的多个界面,并且能展示多个界面之间跳转
xib -- > 编译 --> nib
xib的加载
- 只能能过下面两种方法加载
- 通过alloc init不能自动加载xib
- 但是控制器除外,控制器alloc init 会自动加载同名的xib文件
>>>方法1: NSArray *objc = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil]; [self.view addSubview:objc[1]];
>>>方法2: // 一个UINib对象就代表一个xib文件 // 一般情况下,bundle参数传nil,默认就是mainBundle UINib *nib = [UINib nibWithData:@"test" bundle:[NSBundle mainBundle]]; NSArray *objc = [nib instantiateWithOwner:nil options:nil]; [self.view addSubview:objc[1]];
将类名转换为字符串 NSStringFromClass(self) 相当于Class == XMGShopView NSString == @"XMGShopView"
使用xib自定义view的步骤
- 1.修改xib中view的类名
- 2.封装加载过程
@interface WZShopView : UIView
+ (instancetype)shopView;
@end
@implementation WZShopView
+ (instancetype)shopView
{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
}
- 3.给子控件连线
@interface WZShopView () @property (weak, nonatomic) IBOutlet UIImageView *iconView; @property (weak, nonatomic) IBOutlet UILabel *nameLabel; @end
- 4.增加模型属性,在模型属性set方法中设置数据到子控件上
xib加载原理
当控件是通过代码创建时,初始化会调用init和initWithFrame方法
当控件是通过xib/storyboard创建时,初始化不会调用init和initWithFrame方法
会并且先调用initWithCoder方法来初始化控件
xib系统创建代码 [[UIView alloc] initWithCoder:aDecoder];
awakeFromNib方法,初始化完毕的时候再调用(表示从xib/storyboard中醒来时调用,解析完毕后调用)
- storyBoard初始化完毕时也也会再调用awakeFromNib方法
- 可以在这里添加子控件、设置基本属性
/**
* 初始化代码
*/
- (void)setup
{
self.scrollView.backgroundColor = [UIColor redColor];
}
>