阅读 378

iOS中加载xib(ios load方法加载顺序)

关于 xib 或 storyboard

  • 共同点

    • 都用来描述软件界面

    • 都用 interface builder 工具来编辑

    • 本质都是转换成代码去创建控件

  • 不同点

    • xib是轻量级的,用来描述局部UI界面

    • storyboard是重量级的,用来描述整个软件的多个界面,并且能够展示多个界面的跳转关系


加载xib

xib 文件在编译的后会变成 nib 文件

11975486-4f7dfbf345c0bff5.png

  • 第一种加载方式

    NSArray * xibArray = [[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil] ; return xibArray[0]; 复制代码

  • 第二种加载方式

    UINib *nib = [UINib nibWithNibName:NSStringFromClass(self) bundle:nil]; NSArray *xibArray = [nib instantiateWithOwner:nil options:nil]; return xibArray[0]; 复制代码

    xibArray中log打印 log.png


控制器加载xib

  1. 首先需要对 xib 文件进行一些处理,打开 xib 文件

  2. 点击 "File‘s Owner",设置 Class 为 xxxViewControler 点击"File‘s Owner",设置Class为xxxViewControler.png

  3. 右键 "Files‘s Owner",里面有个默认的IBOutlet变量view,看一下后面有没有做关联,如果没有就拉到下面的View和视图做个关联

    Files‘s Owner与View做关联

  • 第一种加载方式,传入指定的 xib(如CustomViewController)

    CustomViewController *custom = [[CustomViewController alloc]initWithNibName:@"CustomViewController" bundle:nil]; 复制代码

  • 第二种加载方式,不指定 xib

    CustomViewController *custom = [[CustomViewController alloc]initWithNibName:nil bundle:nil]; 复制代码

    • 第一步:寻找有没有和控制器类名同名的xib,如果有就去加载(XXViewController.xib)

      控制器类名同名的xib.png

    • 第二步:寻找有没有和控制器类名同名但是不带Controller的xib,如果有就去加载(XXView.xib)

      11975486-e40e19dd11cafbc5.png

    • 第三步:如果没有找到合适的 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:

    通过init方法初始化自定义控件log打印.png

  • 通过加载 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方法初始化自定义控件log打印.png

  •  伪原创工具 SEO网站优化  https://www.237it.com/ 

小结:

  • 通过代码初始化自定义控件是不会自动加载xib的,它会执行 initWithFrame init

  • 通过加载 xib 初始化自定义控件,仅仅执行 initWithCoderawakeFromNib,如果要通过代码修改 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


作者:NewBoy
链接:https://juejin.cn/post/7035224109118128165


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐