当我们需要自定义一个View控件时,会有 initWithFrame、initWithCoder、awakeFromNib 这三个系统方法,关于这三个方法何时调用,如何调用,有时候可能很多人会弄混淆。

下面我会就理论结合代码举例来说明一下:

1、initWithFrame

- (instancetype)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {NSLog(@"initWithFrame");[self initViews];}return self;
}

这个方法是当控件不是从xib、storyboard中创建时,会调用这个方法,比如:

 XibShow *xib = [[XibShow alloc] initWithFrame:CGRectMake(0, 330, KScreenWidth, 100)];[self.view addSubview:xib];

这里我直接用  [XibShow alloc] initWithFrame  来创建控件,所以,这里自定义控件内,只会走  initWithFrame 方法,其余两个不会走。

2、initWithCoder

- (instancetype)initWithCoder:(NSCoder *)coder
{self = [super initWithCoder:coder];if (self) {NSLog(@"initWithCoder");[self initViews];}return self;
}

当控件是从xib、storyboard中创建时,就会调用这个方法。

概括的理解就是:你的view或cell在xib或storyboard上有体现,比如直接用xib创建的,或是拉控件关联已有类等。

而且,即使我们自定义的view是纯代码,没有xib,但我们在vc的xib里引用了,效果是一样的。

比如,这两种方式创建的自定义view,只要我们有在xib或storyboard里引用过,就都会执行initWithCoder和awakeFromNib

3、awakeFromNib

-(void)awakeFromNib{NSLog(@"awakeFromNib");[super awakeFromNib];[self initViews];
}

这个方法在initWithCoder:方法后调用 ,顺序是:initWithCoder  -> awakeFromNib (下面会有代码截图)

- 可以这么来理解:

一开始经过initWithCoder创建出来的控件是死的,然后通过awakeFromNib来唤醒,所以这会有一个先后的调用顺序。

下面会有一个具体的示例:

1、创建一个vc,在storyboard上关联界面,在界面上新增一个view,关联我们的自定义view:XibShow。

2、在vc里,再额外用代码新增一个自定义view控件,add到另一个位置。

这样,运行出来的结果如下:

其中:打印顺序如上图所示。

可以发现:

1、在viewDidLoad之前,由于是storyboard上创建的类,会先执行好,且会顺序走 initWithCoder、awakeFromNib两个方法

2、到viewDidLoad之后,执行到用代码创建的view,只会走 initWithFrame 方法

PS:这里还有个小细节:我在storyboard上托控件创建的类,即使我给了背景色,但执行出来,还是以自定义view本身的背景色为准。

(可以看上图,开始设的灰色,但运行出来还是红色)

最后总结:

1、initWithFrame只适用纯代码创建时调用,不涉及xib或storyboard。

2、initWithCoder、awakeFromNib是从xib、storyboard中创建时会调用。

3、所以一般来说,为了安全起见,初始化控件的代码我们写在一个方法里面(类似我上面的initViews方法),然后我们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起到作用。

iOS initWithFrame、initWithCoder、awakeFromNib的区别解析相关推荐

  1. initWithFrame,initWithCoder,awakeFromNib的区别

    这三个都是系统初始化视图时会调用的方法. initWithFrame主要用在非xib创建的视图 initWithCoder和awakeFromNib主要用在xib创建的视图    两个调用的先后顺序是 ...

  2. iOS开发教程:Storyboard全解析-第二部分

    如果你想了解更多Storyboard的特性,那么你就来对了地方,下面我们就来接着上次的内容详细讲解Storyboard的使用方法. 在上一篇<iOS开发教程:Storyboard全解析-第一部分 ...

  3. initWithFrame/initWithCode/awakeFromNib调用

    1.当控件不是从 xib.storyboard 中创建时会调用initWithFrame方法 2.当控件是从xib.storyboard中创建时会调用initWithCoder,awakeFromNi ...

  4. 【c/c++】#pragma once 与 #ifndef 的区别解析

    转载 [c/c++]#pragma once 与 #ifndef 的区别解析 2016-03-03 10:03:04 小明6号 阅读数 5092更多 分类专栏: [c/c++] 查看全文 http:/ ...

  5. fread、fwrite、fopen函数的简单使用和open、read、write区别解析

    这几个函数的区别:fread.fwrite.fopen和open.read.write区别解析 标准C库函数的简单使用 fopen函数原型: #include <stdio.h> FILE ...

  6. java boolean if_Java if(boolean)和if(boolean=true)区别解析

    这篇文章主要介绍了Java if(boolean)和if(boolean=true)区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知 ...

  7. 零基础iOS之Json及XML数据解析2

    零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html 转载于:https://www.cnblogs ...

  8. 绝缘栅型n沟道场管_mos的种类有哪些?mos管分类及区别解析

    MOS管种类 最近小编在网上发现很多朋友问:mos的种类有哪些?其实,小编在解答前也不清楚mos的种类,于是小编在网上找到同行发布的关于mos管分类及区别解析!现在小编也转发分享,希望能帮到大家. M ...

  9. android 地球坐标 火星坐标系,IOS开发入门之iOS开发火星坐标系与地球坐标系解析...

    本文将带你了解IOS开发入门iOS开发火星坐标系与地球坐标系解析,希望本文对大家学IOS有所帮助. iOS开发火星坐标系与地球坐标系解析. 在开发过程中,遇到一个问题,安卓和iOS传同样的经纬度给后台 ...

最新文章

  1. hdu 5512 Pagodas
  2. apply的调用 http://bbs.51js.com/thread-82017-1-3.html
  3. oracle10g 04030,一次ORA-04030问题的诊断(一)
  4. common-collections中Java反序列化漏洞导致的RCE原理分析
  5. NHibernate获取实体配置信息(表名,列名等等)
  6. Python矩阵计算
  7. C语言给定3x3矩阵旋转输出
  8. python_cookie
  9. 一步一步SharePoint 2007之二十二:完美解决实现Form认证后无法再用SharePoint Designer编辑网站的问题...
  10. window7 64位下Android studio 安装genymotion模拟器
  11. 【Shell】特殊变量
  12. Java学习笔记--字符串和文件IO
  13. sqlserver200864位下载_SQL2008下载 SQL Server 2008 R2 简体中文版(64位) 下载-脚本之家
  14. 汽车抛负载瞬态7637-5A/5B测试,您不知道的都在这里
  15. linux gpt转mbr命令,linux GPT转mbr
  16. ORA-20011(外部表收集统计信息异常报错)
  17. 核心对象激发状态的意义
  18. 高中数学40分怎么办_高二了数学40多分还有救吗?
  19. IDEA 2020 真的是要本土化,提供简体中文了!
  20. 【2022项目复盘】无位置传感器的无刷直流电机驱动设计

热门文章

  1. VMware 解决 ubuntu 虚拟机 复制文件 失败 闪退
  2. V30升级系统到鸿蒙后体验,会不会是最后一次沾华为的光?荣耀V30 Pro升级Magic UI 4.0使用体验...
  3. [案例]更高效,更安全,北京高法开启“掌上法院”新时代
  4. 什么样的人最适合创业? [转贴]
  5. 软件工程实践作业---软件评测
  6. 【pytest官方文档】解读- 开发可pip安装的第三方插件
  7. css border: datted 和border dashed对比
  8. android模仿qq登录界面,初识Android二之小试牛刀模仿实现qq登陆界面
  9. 带你沉浸式体验删库跑路
  10. 黑鲨4黑鲨4SPro全系列降级救砖9008刷机救砖 修复基带解锁BL获取magisk权限