从nib中加载对象实例时,init:或initWithFrame:都不会调用。而是调用initWithCoder:怎么理解:
 
有时候,知道initWithFrame方法如何用,但是么有弄明白initWithFrame方法到底是什么?

那就通过查资料弄明白。

 
 
1. initWithFrame方法是什么?
 
initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸)。
当然,其他UI对象,也有initWithFrame方法,但是,我们以UIView为例,来搞清楚initWithFrame方法。
 
2.什么时候用initWithFrame方法?
简单的说,我们用编程方式申明,创建UIView对象时,使用initWithFrame方法。
在此,我们必须搞清楚,两种方式来进行初始化UIView。
1.使用 Interface Builder 方式。
这种方式,就是使用nib文件。通常我们说的“拖控件” 的方式。
 
实际编程中,我们如果用Interface Builder 方式创建了UIView对象。(也就是,用拖控件的方式)
那么,initWithFrame方法方法是不会被调用的。因为nib文件已经知道如何初始化该View。(因为,我们在拖该view的时候,就定义好了长、宽、背景等属性)。
这时候,会调用initWithCoder方法,我们可以用initWithCoder方法来重新定义我们在nib中已经设置的各项属性。
 
这就是为什么使用initWithCoder:的原因,因为BIDViewController.xib的view是BIDQuartzFunView类型,而不是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;

}

 
在这里,我想,应该对initWithFrame方法略知一二了。

当我们所写的程序里没用用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;

}

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

initWithCoder: 与initWithFrame:的区别的更多相关文章

  1. awakeFromNib、initWithCoder、initWithFrame三者区别

    (1)awakeFromNib和initWithCoder:差别awakeFromNib 从xib或者storyboard加载完毕就会调用initWithCoder: 只要对象是从文件解析来的,就会调 ...

  2. initWithCoder与initWithFrame的区别

    1. initWithFrame方法是什么?   initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸). 当然,其他UI对象,也有initWithFrame方 ...

  3. initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏

    当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代 ...

  4. iOS initWithFrame、initWithCoder、awakeFromNib的区别解析

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

  5. initwithcoder和 initwithframe 区别?

    每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCod ...

  6. [转载]initwithcoder和 initwithframe

    大前提是UIViewController有一个UIView.同时,需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Buil ...

  7. initWithCoder: 与initWithFrame:

    之前一直用代码来编写画面,现在着手使用storyboard和xib来构筑画面,遇到initWithCoder方法, 故查了下,initWithCoder方法的调用,看了篇博客,链接如下: http:/ ...

  8. iOS 初始化(init、initWithNibName、initWithCoder、initWithFrame)

    很多朋友如果是初学iOS开发,可能会被其中的几个加载方法给搞得晕头转向的,但是这几个方法又是作为iOS程序员必须要我们掌握的方法,下面我将对这几个方法做一下分析和对比,看看能不能增加大家对几个方法的理 ...

  9. 【iOS开发】initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解

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

随机推荐

  1. 微信公众平台可通过UnionID机制在多公众号间帐号互通

    微信公众平台越来越注重开发者的反馈信息了,这不,微信开放平台提供了UnionID机制,通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个公众号,可使用以下办法通 ...

  2. 用原生js实现的链式调用函数

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  3. ReactiveCocoa源码拆分解析(五)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...

  4. Ubuntu 16.04 安装 Apache, MySQL, PHP7

    1.安装之前先更新系统 1 sudo apt update 2.安装Apache2 1 sudo apt install apache2 3.安装PHP 1 sudo apt install php ...

  5. redis 快速入门(win7)

    0:介绍 百度百科or官网 1:下载  选择32位或者64 地址:https://github.com/dmajkic/redis/downloads 1.1下载后如图 1.2文件介绍 redis-s ...

  6. VC++ 产生GUID或UUID

    GUID 和 UUID 是一样的,表示全球唯一标识码. 下面是Windows系统中,产生GUID的一种方法(Windows API) char* GUID_Generator() { ] = {}; ...

  7. resin 安装配置

    resin (下载免费版 4) 前提:已经安装了Java运行环境,resin的安装需要jdk的支持   一.安装 1.cd /usr/local/src wget http://www.caucho. ...

  8. LeetCode之237. Delete Node in a Linked List

    ------------------------------------------------ 因为不知道前序是谁,所以只好采用类似于数组实现的列表移动值, 又因为如果当前是最后一个元素了但是已经没 ...

  9. C#回顾 - 8.利用反射动态创建对象

    拿微信消息返回的示例数据实验 var data = "<xml><ToUserName><![CDATA[toUser]]></ToUserName ...

  10. Delphi DLL的创建、静态及动态调用

    转载:http://blog.csdn.net/welcome000yy/article/details/7905463 结合这篇博客:http://www.cnblogs.com/xumenger/ ...