iOS initWithFrame、initWithCoder、awakeFromNib的区别解析
当我们需要自定义一个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的区别解析相关推荐
- initWithFrame,initWithCoder,awakeFromNib的区别
这三个都是系统初始化视图时会调用的方法. initWithFrame主要用在非xib创建的视图 initWithCoder和awakeFromNib主要用在xib创建的视图 两个调用的先后顺序是 ...
- iOS开发教程:Storyboard全解析-第二部分
如果你想了解更多Storyboard的特性,那么你就来对了地方,下面我们就来接着上次的内容详细讲解Storyboard的使用方法. 在上一篇<iOS开发教程:Storyboard全解析-第一部分 ...
- initWithFrame/initWithCode/awakeFromNib调用
1.当控件不是从 xib.storyboard 中创建时会调用initWithFrame方法 2.当控件是从xib.storyboard中创建时会调用initWithCoder,awakeFromNi ...
- 【c/c++】#pragma once 与 #ifndef 的区别解析
转载 [c/c++]#pragma once 与 #ifndef 的区别解析 2016-03-03 10:03:04 小明6号 阅读数 5092更多 分类专栏: [c/c++] 查看全文 http:/ ...
- fread、fwrite、fopen函数的简单使用和open、read、write区别解析
这几个函数的区别:fread.fwrite.fopen和open.read.write区别解析 标准C库函数的简单使用 fopen函数原型: #include <stdio.h> FILE ...
- java boolean if_Java if(boolean)和if(boolean=true)区别解析
这篇文章主要介绍了Java if(boolean)和if(boolean=true)区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知 ...
- 零基础iOS之Json及XML数据解析2
零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html 转载于:https://www.cnblogs ...
- 绝缘栅型n沟道场管_mos的种类有哪些?mos管分类及区别解析
MOS管种类 最近小编在网上发现很多朋友问:mos的种类有哪些?其实,小编在解答前也不清楚mos的种类,于是小编在网上找到同行发布的关于mos管分类及区别解析!现在小编也转发分享,希望能帮到大家. M ...
- android 地球坐标 火星坐标系,IOS开发入门之iOS开发火星坐标系与地球坐标系解析...
本文将带你了解IOS开发入门iOS开发火星坐标系与地球坐标系解析,希望本文对大家学IOS有所帮助. iOS开发火星坐标系与地球坐标系解析. 在开发过程中,遇到一个问题,安卓和iOS传同样的经纬度给后台 ...
最新文章
- hdu 5512 Pagodas
- apply的调用 http://bbs.51js.com/thread-82017-1-3.html
- oracle10g 04030,一次ORA-04030问题的诊断(一)
- common-collections中Java反序列化漏洞导致的RCE原理分析
- NHibernate获取实体配置信息(表名,列名等等)
- Python矩阵计算
- C语言给定3x3矩阵旋转输出
- python_cookie
- 一步一步SharePoint 2007之二十二:完美解决实现Form认证后无法再用SharePoint Designer编辑网站的问题...
- window7 64位下Android studio 安装genymotion模拟器
- 【Shell】特殊变量
- Java学习笔记--字符串和文件IO
- sqlserver200864位下载_SQL2008下载 SQL Server 2008 R2 简体中文版(64位) 下载-脚本之家
- 汽车抛负载瞬态7637-5A/5B测试,您不知道的都在这里
- linux gpt转mbr命令,linux GPT转mbr
- ORA-20011(外部表收集统计信息异常报错)
- 核心对象激发状态的意义
- 高中数学40分怎么办_高二了数学40多分还有救吗?
- IDEA 2020 真的是要本土化,提供简体中文了!
- 【2022项目复盘】无位置传感器的无刷直流电机驱动设计
热门文章
- VMware 解决 ubuntu 虚拟机 复制文件 失败 闪退
- V30升级系统到鸿蒙后体验,会不会是最后一次沾华为的光?荣耀V30 Pro升级Magic UI 4.0使用体验...
- [案例]更高效,更安全,北京高法开启“掌上法院”新时代
- 什么样的人最适合创业? [转贴]
- 软件工程实践作业---软件评测
- 【pytest官方文档】解读- 开发可pip安装的第三方插件
- css border: datted 和border dashed对比
- android模仿qq登录界面,初识Android二之小试牛刀模仿实现qq登陆界面
- 带你沉浸式体验删库跑路
- 黑鲨4黑鲨4SPro全系列降级救砖9008刷机救砖 修复基带解锁BL获取magisk权限