iOS Nib文件与手动编码初始化区别

iOS NSBundle文件与nib文件——iOS 编码复习(十) @NSBundle包,是一种特定的文件类型,一个主要作用是获取Resources文件中的资源 bundle是一个目录,其中包含了程序会使用的资源,这些资源包含了如图像、声音、编译好的代码、nib文件;cocoa提供了一个类NSBundle。我们的程序是一个bundle。在finder中,一个应用程序看上去和其他文件没有什么区别,但是实际上它是一个包含了nib文件、编译代码、以及其他资源的目录。我 阅读详情

从Nib中加载对象实例时,init:或initWithFrame:都不会调用。而是调用initWithNibName 或initWithCoder:怎么理解?

1. initWithFrame方法是什么?

initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸)。

当然,其他UI对象,也有initWithFrame方法。我们可以以UIView为例,来搞清楚initWithFrame方法。


2.什么时候用initWithFrame方法?

简单的说,我们用手动编码方式声明、创建UIView对象时,会使用initWithFrame方法。


3.在此,我们必须搞清楚,初始化UIView的两种方式。

1.使用 Interface Builder 方式。

这种方式,就是使用nib文件。通常我们说的“拖控件” 的方式。实际编程中,我们如果用Interface Builder 方式创建了UIView对象。那么,initWithFrame方法方法是不会被调用的。因为nib文件已经知道如何初始化该View。(因为,我们在拖该view的时候,就定义好了长、宽、背景等属性)。

这时候,会调用initWithCoder方法,我们可以用initWithCoder方法来重新定义我们在nib中已经设置的各项属性。这就是为什么使用initWithCoder的原因。

因为MSKView.xib的view是MSKView类型,而不是UIView类型了,所以其实是从nib中加载对象实例。


2.使用手动编码方式。

就是我们声明一个UIView的子类,进行“手工”编写代码的方式。

实际编程中,我们使用编程方式下,来创建一个UIView或者创建UIView的子类。这时候,将调用initWithFrame方法,来实例化UIView。

特别注意,如果在子类中重载initWithFrame方法,必须先调用父类的initWithFrame方法。在对自定义的UIView子类进行初始化操作。

比如:

- (id)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];// 先调用父类的initWithFrame方法

    if (self) {

        // 再自定义该类(UIView子类)的初始化操作。

        _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];

        [_scrollView setFrame:CGRectMake(0, 0, 320, 480)];

        _scrollView.contentSize = CGSizeMake(320*3, 480);

        

        [self addSubview:_scrollView];

    }

    return self;

}


当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化


- (id)initWithFrame:(CGRect)frame{

    if (self =[superinitWithFrame:frame]) {

        // 初始化代码

    }

    return self;

}


用于视图加载nib文件,从nib中加载对象实例时,使用 initWithCoder初始化这些实例对象


- (id)initWithCoder:(NSCoder*)coder{

    if (self =[superinitWithcoder:coder]) {

        // 初始化代码

    }

    return self;

}


initWithCoder和initWithFrame的区别 :

1.initWithCoder: 对于.xib,当你嵌入一个视图对象到xib,视图加载时默认调用的是该方法;例如:假如创建的view来自nib,那么将会调用initWithCoder,由系统来调用,自己不能调用。

2.initWithFrame: 非.xib的手动编码,视图加载时默认调用的是该方法。是由自己调用,来初始化对象的


文档说明:The init method that gets used depends on how the view is created. It can be explicitly created using initWithFrame or it can be created by loading a nib. In that case, the initWithCoder method gets called when the view is loaded from the nib. There are other init methods for subclasses (like UITableViewController has initWithStyle), so you have to be sure which one is being called. 


4.initWithNibName、initWithCoder、awakeFromNib的区分。

第一、initWithNibName 这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 


第二、initWithCoder 是一个类在IB中创建但在xocde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xcode中通过 initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.或者是一个view的nib文件,类似方法创建时调用initWithCoder 


第三、awakeFromNib 当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象时执行awakeFromNib


第四、关于initWithNibName 和 loadNibNamed 的区别和联系 : 

之所以要把这两者来一起讲,因为这两个方法,根本就不是一路货色,他们的联系:可以使用此方法加载用户界面(xib文件)到我们的代码中,这样,可以通过操作这个加载进来的(xib)对象,来操作xib文件内容。 下面进入主题,谈区别: 


1. ShowViewController的initWithNibName方法 

ShowViewController  *showMessage = [[ShowViewController alloc] initWithNibName:@"ShowViewController" bundle:nil]; 


2. ShowViewController的loadNibNamed方法 

NSArray  *nib = [[NSBundle mainBundle] loadNibNamed:@“MSKView” owner:self options:nil] ; 


总结: 只看他们初始化,那可能感觉是一样的。但是如果,打开分别看xib的关系的时候,才恍然大悟,原来他们的集成类都不一样。


1. initWithNibName要加载的xib的类为我们定义的视图控制器类。loadNibNamed要加载的xib的类为NSOjbect。

2.加载方式不同。

initWithNibName方法:是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil 

loadNibNamed方法:即时加载,用该方法加载的xib对象中的各个元素都已经存在。 

(认真理解这句帮规:when using loadNibNamed:owner:options:, the File's Owner should be NSObject, the main view should be your class type, and all outlets should be hooked up to the view, not the File's Owner.) 




nib文件结构分析 nib文件二进制结构,像一个字典,headers中保存的sections中的地址信息,类似于字典中的目录,而values中保存的keys的序列号,像是字典中一个字符解释时使用到另一个字符的信息。这种存储的方式在现实生活中的仓储中也是很常见的。现象不同但本质是相同的。nib文件二进制结构,像一个字典,headers中保存的sections中的地址信息,类似于字典中的目录,而values中保存的keys的序列号,像是字典中一个字符解释时使用到另一个字符的信息。这种存储的方式在现实生活中的仓储中也是很常见的。 阅读详情

相关推荐

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 150

什么是Nib文件

Nib文件是一种特殊类型的资源文件,它用于保存iPhone OS或Mac OS X应用程序的用户接口。Nib文件是Interface Builder文档。通常您会使用Interface Builder设计应用程序的可视部分-例如窗口或视图。有些时候,您可能也用它来配置一些不可视的

henry_sea的专栏 1万+

Hierarchical Flow Partition(Top-down&&Bottom-up)

hierarchy flow是将设计切分成多个block,分别处理单个block,然后完成后,将它们进行拼接以完成最终的chip。一般划分为三个阶段:chip planning;physical budget就是pin assignmenthierarchy flow实现的方法有两种,一种是top-down,另一种是bottom-up,无论是哪种,都是都要通过flatten的方法分别全局范围进行优化实现。

qq_39493558的博客 3072

Nib文件

一. 什么是Nib文件            Nib文件是保存由Interface Builder创建的对象及对象间关系的一种资源文档。Nib文件中的对象包括:接口对象(可视化对象--窗口,视图,控件,菜单...;非可视化对象--窗口控制器,视图控制器,程序委托代理...)和占位符对象(File's Owner,First  Responder,Application)。它描述了对象,以及对

nokiaxjw的专栏 6743

从FPGA工程师视角看CXP-12:如何用Xilinx GTX/GTH收发器搞定一条50Gbps的工业相机数据流?

本文从FPGA工程师视角详细解析了如何利用Xilinx GTX/GTH收发器实现50Gbps的CXP-12工业相机数据流传输。通过协议分析、硬件设计要点和FPGA逻辑实现,帮助开发者高效构建高带宽工业视觉系统,特别适合4K/8K高分辨率图像处理需求。

weixin_42533622的博客 282

基于Multisim的模电调幅发射机仿真设计

振荡器产生的高频信号的功率很小,所以有必要对高频信号进行功率放大,有利于信号的调制发射。缓冲电路将主振荡器和高频功放电路相隔离,以减小功放电路对主振荡器的影响。缓冲电路可以用射极跟随器电路来实现,其作用就是前后级的阻抗相互匹配,减小前后级的影响。总电路的仿真结果见下图:示波器1~4分别是主振荡器、缓冲电路、高频放大电路和调幅电路的输出波形。由于载波频率稳定度≤10-3,所以可以采用并联型改进电容反馈式三端振荡器(Seiler电路)谐振回路,滤除其他频率的成分,得到与载波(假设。(1)缓冲电路的设计与实现。

Eve223322的博客 4592

如何打开Nib文件

作者:ani_di  版权所有,转载务必保留此链接 http://blog.youkuaiyun.com/ani_di 如何打开Nib文件 有段时间没有灌水,今天分享一个小技巧。 nib文件是Cocoa App的界面资源,代码中一般用xib代替了nib,因为这样方便版本管理。发布出去的仍然是nib,而且是编译后的nib,这种文件直接用xcode是不能被打开的。 可以手工修改一下nib

ani_di的专栏 1万+

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

当AI遇上气候变化:用ChatGPT+Python自动化处理CMIP6数据的5个技巧

本文探讨了如何利用ChatGPT和Python自动化处理CMIP6数据,提升气候变化研究效率。通过5个实用技巧,包括智能数据下载、异常值检测、一键可视化、元数据管理和自动化报告生成,帮助研究人员构建高效的数据处理流水线。特别适用于极端气候分析和降尺度技术应用场景。

table的专栏 178

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

视觉人机器视觉的博客 1480

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传统电位器/编码器相比,AS5600具有显着优势:高精度、非接触式、旋转角度无限制。 所有这些优点使其适用于非接触式角度测量应用,例如机器人手臂、云台、电机闭环控制、机床轴定位。

视觉与物联智能 2552

Xib与Nib区别联系

1.前端渲染/SDK指令不受客户端控制 2.Xcode中很多配置文件其实是html5类前端风格文件可视化呈现。 3.InterfaceBuilder界面编译器交互环境可视化,xib与nib为界面编译器的图形界面设计文档。(InterfaceBuilderXML设计文档/InterfaceBuilderNextStep设计文档) 4.xib(InterfaceBuilderXML图形文档)属于XML...

yanhaijunyan的博客 2086

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

iOS initWithFrame 和 initWithCoder的使用以及区别

initWithFrame  和   initWithCoder 当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化 - (id)initWithFrame:(CGRect)frame {     if (self =[superinitWithFrame:frame]) {         // 初始化代码     }  

OnWay的专栏 794

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

iOS开发知识总结

iOS App 图标和启动画面尺寸Lauch Image 一张图了解App Icon 更多具体信息在这里了解App Icons on iPad and iPhoneiOS Human Interface Guidelines也对界面设计有讨论,因此可以参考。App Icon initWithFrame与initWithCoder的区别 initWithCoder: 对于.xib,当你嵌入一

shawjan的专栏 410

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

initWithCoder与initWithFrame的区别

1.initWithFrame方法是什么? initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸)。 当然,其他UI对象,也有initWithFrame方法,但是,我们以UIView为例,来搞清楚initWithFrame方法。 2.什么时候用initWithFrame方法? 简单的说,我们用编程方式申明,创建UIView对象时...

weixin_30906671的博客 79

awakeFromNib viewDidLoad initWithCoder loadView

  awakeFromNib 当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib  viewDidLoad 当view对象被加载到内存是就会执行view

@implemention NSiOSBlog 1577

JavaWeb从入门到项目实战:Servlet、JSP与框架学习路线全解析

Web开发是后端工程师的核心技能之一,而JavaWeb正是连接浏览器与服务器之间数据交互的技术基石。理解HTTP协议、请求响应模型与Session/Cookie会话机制,是掌握Servlet运行原理和JSP页面渲染的前提。从Servlet的生命周期到MyBatis的SQL映射,再到Spring IoC与AOP的事务管理,JavaWeb知识体系构成了Spring Boot等主流框架的底层逻辑。对于初学者而言,通过旅游管理系统这类完整项目,将用户登录、景点浏览、订单提交及权限拦截等模块串联起来,才能真正打通从理

weixin_34343308的博客 302

initWithNibName initWithCoder awakeFromNib

第一、initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第二、initWithCoder 是一个类在IB中创建但在xocde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xcode中通过 initWithNibName来实例化这个controller,那么这个contro

Soccer_ZZM的博客 427

数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver

在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态。在iOS和OS X上,苹果提供了三种选择:Core Data、属性列表(Property List)和带键值的编码(NSKeyedArchiver)。当涉及到建模、查询、遍历、持久化等复杂的对象图时,Core Data无可替代。但并非所有应用程序都需要查询数据、处理复杂对象图,有时候使用NSKeyedArchiver更为简单。 1. 使用NSKeyedArchiver 如果要将各种类型的对象存储到文件中,

feelinghappy的专栏 751

【独家整理】3步装完:用友NC6.5安装包下载与环境自查指南

这份仓库提供用友NC6.5安装包下载文件(`nc6.5安装包.zip`),它是用友 NC6.5 的部署包。NC6.5 面向大型企业和集团,用来集中管理财务、供应链等业务流程,底层基于 SOA 和 J2EE 技术——简单说就是"把各业务模块拆开再组装",方便按需扩展。本指南带你从拿到文件、装前自查到装完验证,一次装对。 ## 谁需要这份安装包 - 你是集团或大型企业的 IT 管理员、实施顾问,任

gitblog_01000的博客 317

loadView与viewDidLoad不同 && loadView学习总结

loadView学习总结 UIViewController类或其子类会在初始化时创建一个UIView对象,会作为控制器的默认视图显示出来,可以通过self.view寻址访问。但没有调用loadView方法时,self.view=nil。loadView在每一次使用self.view这个property,并且self.view为nil的时候被调用,用以产生一个有效的self.vi...

weixin_30363981的博客 89

Stylus JavaScript API 完全指南:从 render() 到插件系统的 Node.js 集成实战

Stylus 本质上是一个为 Node.js 打造的 CSS 预处理器库,其核心价值不仅在于丰富的语言特性,更在于一套完整、可链式调用的 JavaScript API。本文将以 [docs/docs/js.md](https://link.gitcode.com/i/fb13ffd67548a977acfa4757fa7dd77d) 为骨架,结合仓库源码([lib/stylus.js](https

gitblog_07048的博客 336

【亲测免费】 Nib-Decompiler: Swift Interface Builder 文件反编译器

Nib-Decompiler: iOS UI 编辑器利器 Nib-Decompiler 是一个开源项目,可以帮助您解码、编辑和重新编译 iOS 应用程序中的 .nib 文件,从而实现对界面元素的轻松调整和调试。 什么是 .nib 文件? .nib 文件是 Interface Builder 中创建的用户界面文件。这些文件包含了诸如视图、控件和其他界面元素的信息,用于在应用程序运行时构建用户界面。 ...

gitblog_00007的博客 826
上一篇: iPhone文件路径大全
下一篇: Xcode8 模拟器无法卸载应用
Dancer2015
博客等级 码龄12年 17粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值