您的位置:首页 > 移动开发 > IOS开发

IOS学习 nib加载相关内容(1)

2015-07-24 21:52 357 查看
今天,看了关于nib的一些文章,自己也试了下,总结一下。

首先nib,文件是一种数据文件,用于存储可在应用程序需要时使用的一些“冻结”的对象。大多数情况下,应用程序使用nib文件来存储构成用户界面的窗口和视图。当您将nib文件载入应用程序时,nib装载代码会将文件中的内容转化为应用程序可以操作的真正对象。通过这个机制,nib文件省去了用代码创建那些对象的工作。
Interface Builder是一个可视化的设计环境,您可以用它来创建nib文件。您可以将标准对象(比如UIKit框架中提供的窗口和视图)和Xcode工程中的定制对象放到nib文件中。在Interface
Builder中创建视图层次相当简单,只需要对视图对象进行简单拖拽就可以了。您也可以通过查看器窗口来配置每个对象的属性,以及通过创建对象间的连接来定义它们在运行时的关系。您所做的改变最终都会作为nib文件的一部分存储到磁盘上。
在运行时,当您需要nib文件中包含的对象时,就将nib文件装载到程序中。典型情况下,装载nib文件的时机是当用户界面发生变化和需要在屏幕上显示某些新视图的时候。如果您的应用程序使用视图控制器,则视图控制器会自动处理nib文件的装载过程,当然,您也可以通过NSBundle类的方法自行装载。(转自:http://blog.csdn.net/linux_zkf)
上面大概介绍了nib文件,下面就来研究下红色区域的自动处理。
现在,通常使用代码和IB结合的方式来处理视图控制器,那么写法通常是A.h、A.m、A.xib。这里A.xib中的File's
Owner需要是A类,并且我们会把A.view与A.xib中的相关联(这里强调一下,当生成A对象的时候会自动寻找A.nib(装载同名的nib文件),也就是说A.xib改个名字之后。例C.xib,会生成C.nib,但是C.nib不会在运行时装载到程序中,即使A.view与C.xib关联)。
这样当我们创建一个A对象的时候:

A *AController = [[Aalloc]initWithXXX:数据];

执行顺序:

1. A的 (id)initWithXXX:

2. A的[superinit]

3. A的- (id)initWithNibName:(NSString
*)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil(即使A没有xib也会调用)

4. A super的- (id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil

5. A的 (id)initWithXXX:
6.
A的 (void)loadView://这里如果loadView被重写则无法正常装载nib文件,即使用super;

- (void)loadView

{
[superloadView];//在重写loadView后
7和8都不会执行,因为没有装载nib文件
}
7. A subView的 - (id)initWithCoder:(NSCoder
*)aDecoder
8. A subView的 -
(void)awakeFromNib

9. 最后进行A的 - (void)viewDidLoad

下面是百度的一个比较准的解释:
第一、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 的区别和联系 :

关于 initWithNibName 和 loadNibNamed 的区别和联系。之所以要把这两者来一起讲,我觉的我也有点困惑,到底用那种?其实真正搞清楚了他们之间的差别,就不会这么迷惘了。因为这两个方法,根本就不是一路货色。

既然,是要说明这2个方法,那就着重将区别吧。

但是第一步,还是要罗嗦一下,他们的联系:可以使用此方法加载用户界面(xib文件)到我们的代码中,这样,可以通过操作这个加载进来的(xib)对象,来操作xib文件内容。

下面进入主题,谈区别:

1. ShowViewController的initWithNibName方法

ShowViewController * showMessage = [[ShowViewController alloc]

initWithNibName:@"ShowViewController" bundle:nil];

self.showViewController = showMessage;

[showMessage release];

2.VideoCellController的loadNibNamed方法

NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"Save3ViewController"

owner:self options:nil] ;

总结:

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

1. initWithNibName要加载的xib的类为我们定义的视图控制器类 (这个就是UIViewController的方法)

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.)

第五、initWithCoder和initWithFrame的区别

initWithCoder 是当从nib文件中加载对象的时候会调用,比如你的view来自nib那么就会调用这个view的这个函数。(由框架调用)

initWithFrame (是由用户调用,来初始化对象的)

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: