前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS-关于加载xib

iOS-关于加载xib

作者头像
xy_ss
发布2023-11-22 09:06:35
2490
发布2023-11-22 09:06:35
举报
文章被收录于专栏:浮躁的喧嚣

关于xib或storyboard

  • 共同点 都用来描述软件界面 都用interface builder工具来编辑 本质都是转换成代码去创建控件
  • 不同点 xib是轻量级的,用来描述局部UI界面 storyboard是重量级的,用来描述整个软件的多个界面,并且能够展示多个界面的跳转关系

加载xib

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

xib文件.png

  • 第一种加载方式
代码语言:javascript
复制
NSArray * xibArray = [[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil] ;
return xibArray[0];
  • 第二种加载方式
代码语言:javascript
复制
UINib *nib = [UINib nibWithNibName:NSStringFromClass(self) bundle:nil];
NSArray *xibArray = [nib instantiateWithOwner:nil options:nil];
return xibArray[0];

xibArray中log打印

log打印

控制器加载xib

  1. 首先需要对xib文件进行一些处理,打开xib文件
  2. 点击"File‘s Owner",设置Class为xxxViewControler
  3. 右键"Files‘s Owner", 里面有个默认的IBOutlet变量view, 看一下后面有没有做关联,如果没有就拉到下面的View和视图做个关联

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

Files‘s Owner与View做关联

  • 第一种加载方式,传入指定的xib(如CustomViewController)
代码语言:javascript
复制
CustomViewController *custom = [[CustomViewController alloc]initWithNibName:@"CustomViewController" bundle:nil];
  • 第二种加载方式,不指定xib
代码语言:javascript
复制
CustomViewController *custom = [[CustomViewController alloc]initWithNibName:nil bundle:nil];

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

控制器类名同名的xib

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

和控制器类名同名但是不带Controller的xib

第三步:如果没有找到合适的xib,就会创建一个View(白色View,为系统自己创建的)

xib自定义控件与代码自定义的区别

这是自定义的一个View,我们通过不同的初始化方式去判断它的执行方法

代码语言:javascript
复制
#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方法初始化自定义控件
代码语言:javascript
复制
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    CustomViw *customView = [[CustomViw alloc] init];
}
@end

log打印

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

  • 通过加载xib方法初始化自定义控件
代码语言:javascript
复制
@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打印

代码实验结论: 通过代码初始化自定义控件是不会自动加载xib的,它会执行initWithFrameinit 通过加载xib初始化自定义控件,仅仅执行 initWithCoderawakeFromNib,如果要通过代码修改xib的内容,一般建议放在awakeFromNib方法内

控件封装

一般封装一个控件,为了让开发者方便使用,通常会在自定义的控件中编写俩个方法初始化方法,这样不管是通过init还是加载xib都可以实现相同的效果

代码语言:javascript
复制
#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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于xib或storyboard
  • 加载xib
  • 控制器加载xib
  • xib自定义控件与代码自定义的区别
  • 控件封装
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档