使用Xcode做iOS项目,经常会和Xib文件打交道,因为Xib文件直观的展现出运行时视图的外观,所以上手非常容易,使用也很方便,但对于从未用纯代码写过视图的童鞋,多数对Xib的理解有些片面。

Xib文件是什么?

A nib file describes the visual elements of your application’s user interface, including windows, views, controls, and many others. It can also describe non-visual elements, such as the objects in your application that manage your windows and views.

上面是Guides上的定义,nib文件(就是Xib文件)是描述应用外观的视觉元素,包含了窗口、视图、控制和其他,它也可以描述非视觉元素,如你应用中管理窗口和视图的对象。

也就是说,Xib就是一个描述文档,这里面包含了用户界面和用户界面相关元素。这样做的主要原因是,方便程序员,因为其是“所见即所得”的,程序员不需要像原来一样写一堆代码,然后运行出来才能看到界面元素的执行结果,这样是很低效的。更多内容可参看官网

Xib文件是如何做到“所见即所得”?

在Xcode中,以“source code”的方式,打开Xib文件,发现它是一份以XML编码的文件,也就是说Xib文件的本质是用一份XML的脚本描述了程序员在Xcode中对文件中View及其子类等的设置,这里我们已经知道在Xcode中的设置是如何保存下来的,接着Xib文件如何在应用执行是重建到内存中。

在Xcode中新建一份空白的Xib文件,会得到如下代码:

这里对XML进行了解析并图形显示,可以看到Xib文件还是比较复杂的,前面展开的这几项均是系统和版本描述,可以先忽略,重点是蓝色框內的内容(以下解释均非官方版本,请谨慎阅读)。

我们可以从名称“IBDocument.IntegratedClassDependencies”直接看出,这个数组是完成对IBDocument相关类的描述,默认会有IBProxyObject(与File‘s owner有关)、IBUIView(与主视图有关),如果我们拖进一个label进入view,这里便会有UILabel类的描述,如果选择layout,会有NSLayoutConstraint。

这块有Metadata,暂时还不知道是如何使用的,但接下,我们将看到View的全貌

如同RootObjects的名字,这个数组包含了所有的Xib文件中的对象,第一个是Files Owner,第二个是FirstResponder,可以看到其都使用ProxyObject。这里就有一个关于Xib文件实现的细节,当我们的应用里是谁要去读入和使用到这份用户界面时,想到的是我们代码里的ViewController,这时ViewController已经在内存中,那从Xib文件读出的这些配置如何与ViewController关联就是一个问题了,这里使用ProxyObject在Xib文件中做ViewController的代理对象,如下图

接着看XML:

IBClassDescriber中,在我们设置关联后,将有IBOutlet和IBAction与Xib的相互关联描述在这里,IBObjectContainer包含了对象之间的关系,

通过记录的这些内容,在Xib被unarchive后,将新创建的对象(通过Xib文件创建)的设置成相互的reference。

这应该是个复杂的过程,参看官方文档Xib文件载入的步骤如下:

1 加载nib文件的内容和其引用的资源文件到内存:
    2 unarchives nib文件的object graph数据并且实例化的这些对象。根据对象的类型和其在文档中的编码来初始化每个新对象。

3 通过初始化方法,它重建的所有连接(actions, outlets, and bindings)在nib文件中的对象。

以上3步,iOS与OS X不太相同,这里主要说下在iOS中,也就是nib文件中的创建的对象,重新连接每没一个outlet指向时,是基于NSKeyValueCoding Protocol ,通过setValue:forKey: 来完成的。

以上主要是通过看Xib文件XML的数据和官方文档,完成了对Xib文件中内容的大致理解,对其细节实现并没有深入分析,主要的目的让我们在使用Xib文件,对它不再陌生,出现Xib文件执行时错误,可以根据错误信息来推测出错的地方。

Nib Files Store the Objects of Your Application’s User Interface

Xib文件使用(一)——xib文件解析相关推荐

  1. 工程是.java文件_1.8 工程相关解析(各种文件,资源访问)

    本节引言: 前面讲了一堆看似和我们Android开发无关的东西是吧,当然是现在看似而已,以后你回头看就知道了! 好吧,本节我们就来以前面创建的Hello World项目为入口,来了解工程结构, 以及A ...

  2. SpringBoot文件上传源码解析

    一.SpringMVC文件上传源码分析前言(这部分我觉得原作者写的很好) 该如何研究SpringMVC的文件上传的源码呢? 研究源码并不是仅仅知道程序是怎样运行的,而应该从宏观的角度.不同的立场去看待 ...

  3. android xml 未能解析文件,Android Studio提示“无法解析符号”,但项目已编译

    我在build.gradle中使用以下内容在AndroidStudio中导入twitter4j: dependencies { compile 'com.android.support:support ...

  4. java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...

    网友求助:dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件 问题importjava.text.SimpleDateFormat; import ...

  5. .so是什么文件_安卓 so 文件解析详解

    so 文件是啥?so 文件是 elf 文件,elf 文件后缀名是.so,所以也被称之为so 文件, elf 文件是 linux 底下二进制文件,可以理解为 windows 下的PE文件,在 Andro ...

  6. 一个mapper接口有多个mapper.xml 文件_MyBatis 源码解析:映射文件的加载与解析(上)

    上一篇我们分析了配置文件的加载与解析过程,本文将继续对映射文件的加载与解析实现进行分析.MyBatis 的映射文件用于配置 SQL 语句.二级缓存,以及结果集映射等,是区别于其它 ORM 框架的主要特 ...

  7. linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2

    Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...

  8. 织梦模板文件不存在,无法解析文档的最快解决方法

    在织梦文件里找到下面2个文件: include/arc.listview.class.php include/arc.archives.class.php 在这2个文件里搜索 模板文件不存在,无法解析 ...

  9. 文件操作安全之-文件解析原理篇

    本节将详细的解释一下文件解析相关内容,作为我的专栏<WEB安全原理和多种防御方法解读>中的一节. 本文所涉及的文件解析主要指的是WEB领域的文件解析.当访问一个网站或者某个网站特定的页面, ...

  10. php 静态配置文件问题,Nginx+PHP 配置漏洞:静态文件都可以当作 PHP 解析

    漏洞危险等级:毁灭性. 这个漏洞严格上说并不是 Nginx 和 PHP 本身的漏洞造成的,而是由配置造成的.在我之前写的许多配置中,都普遍存在这个漏洞. 简易检测方法: 打开 Nginx + PHP ...

最新文章

  1. 天池算法赛:数据挖掘经典赛事!DCIC 2020 数字中国创新大赛启动!
  2. Java构造函数的使用_java中构造函数的使用方法
  3. 程序员所应具备的品质
  4. 详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生
  5. java开发乱码解决
  6. mysql5.5数据备份_MySql5.5备份和还原
  7. 面试官:谈谈你对IO流和NIO的理解
  8. 直线检测原理matlab,Hough变换 直线检测原理及其Matlab实现
  9. 混合现实:未来七大航空制造技术之一!
  10. 两种方式打开jar文件
  11. vsftpd 配置-使用虚拟账户登录
  12. 极大似然估计方法(Maximum Likelihood Estimate Method)
  13. cbv本质,前后端交互编码方式,django模板使用的2种方式,模板语法
  14. 斐讯路由器宽带运营商服务器,斐讯(PHICOMM)路由器设置网址
  15. imo教我们的互联网思维9大玩法
  16. Linux系统启动流程及服务管理控制
  17. python迷宫小游戏代码_python迷宫游戏,迷宫生成,解决与可视化
  18. 微信小程序input禁止输入特殊表情符号与空格
  19. 应急响应 | Windows事件ID及解释大全
  20. 创建DAO模式的步骤

热门文章

  1. LabVIEW读海康网络摄像头问题
  2. dcp9020cdn可以打印a3纸吗_印品质量 细节对比_兄弟 9020CDN_办公打印评测试用-中关村在线...
  3. mysql 如何时间分组,mysql如何按时间分组查询
  4. 贝塞尔曲线是什么?如何用 Canvas 绘制三阶贝塞尔曲线?
  5. Ubuntu18.04更换下载源时卡在waiting for unattended-upgr to exit(更换下载源 正在等待unattended-upgr 退出)问题的解决办法
  6. 关于pip下载很慢很慢
  7. 进入微信后提示用浏览器打开
  8. C++ 一文解决 数据库ODB 安装/调试/使用的问题
  9. 宇宙最强IDE!微软正式宣布 Visual Studio 2019
  10. PHP日期转换为时间戳