initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解

第一、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] ;

self.showViewController = [nib lastObject];

[nib objectAtIndex:0];

总结:

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

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

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的区别

nitWithoder 是当从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.

initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解,布布扣,bubuko.com

时间: 2024-07-28 15:35:32

initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解的相关文章

iOS开发——UI篇OC篇&UICollectionView详解+实例

UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2.继承自UIView的子类,比如HMWaterflowViewCell * 代表着瀑布流数据中的一个单元(一个格子) 3.总结 HMWaterflowView和HMWaterflowViewCell的关系实际上类似于 UITableView和UITableViewCell的关系 二.设计HMWater

iOS SDK详解之NSCoding协议

原创blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=contents 欢迎关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言:NSCoding是对iOS中的Model类进行编码和解码必须要遵循的协议,如果一个对象要被归档,那么这个协议是必须的. NSCoding要实现两个方法 - initWithCoder: //解码 - enc

iOS网络编程(六) NSURLSession详解

昨夜浏览Demo的时候,看到别人请求网络数据用的是NSURLSession,当时就在想这里什么,怎么没有用过,引起了我的好奇心,遂去百度-谷歌-官方文档一一查看,有了一定的了解,原来NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的. 查找资料,写了一个小Demo,大家可以看看,有什么不足的地方,可以留言帮我指出来. // // HMTRootViewController.m // // // Created by HMT on 14-6-7.

macOS开发之NSTableView的应用详解 - 转

传送门:https://my.oschina.net/u/2340880/blog/886861 摘要: NSTableView是AppKit中的表视图控件,是macOS开发中非常重要的一种视图控件.熟练应用NSTableView控件对mac软件开发十分重要. NSTableView的应用详解 一.引言 和iOS开发中的UITableView有很大差别,NSTableView并非是一个可滚动的列表视图,其是一个不可滚动.支持多列多行的原始列表视图.若要使NSTableView支持滚动,通常会将其

UITabBarController详解

UITabBarController详解 UITabBarController使用详解 UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等.UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中. 首先我们看一下它的view层级图: 一.手动创建UITabBarController 最常见的创建UITabBarContr

【UIKit】AppDelegate详解以及部分UIApplication 的调用

[UIKit]AppDelegate 在应用程序启动完毕后调用(只会调用一次,第一次打开程序的时候才会调用) - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 创建一个UIWindow CGRect rect = [[UIScreen mainScreen] bounds]; self.window = [[UIWind

'Can't add self as subview'崩溃日志详解

问题描述:这个问题非常常见,就是平时我们做一个按钮(我们假设这个页面是RootVC),按钮加一个事件,点击这个事件的时候会push出一个新的控制器A,当我们连续快速(时间间隔在0.5S内,也就是PUSH前一个事件的PUSH动画还没结束之前)点击两次这个按钮的时候,就会导致这个按钮连续响应了两次事件,同时推出了两个控制器A1.A2(这两个控制器都是A类型的),当我们再次点击A1(A2)返回的时候,点击第一次返回会是黑屏,再次点击A2(A1)返回的时候,就会报以下这个崩溃.*** Terminati

iOS: 沙盒的详解和目录的获取

沙盒的详解: •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle       //该目录下的文件是用来存储应用程序包的,包中含有应用程序和素材资源 –Documents //该目录下的文件通常用来持久性存储数据并备份,例如归档文件 –Library/Caches //该目录下的文件通常用来持久性存储数据,没有对数据进行备份 –Library/Preference //该目录下的文件用来持久性存储系统的设备信息,并对

【UIKit Basics】AppDelegate详解

[UIKit]AppDelegate: 在应用程序启动完毕后调用(只会调用一次,第一次打开程序的时候才会调用) // 视图加载完成,应用程序加载到内存后调用的方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 创建一个UIWindow CGRect rect = [[UIScreen mainScreen] boun