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];
}

>

results matching ""

    No results matching ""