iOS控制器与视图加载方法
转载记录, 请看原文:
1. iOS中的各种加载方法(initWithNibName,loadNibNamed,initWithCoder,awakeFromNib等等)简单使用 http://www.jianshu.com/p/b1352b483d85
2. initWithNibName与一般init的区别 http://blog.csdn.net/zengraoli/article/details/12882017
=============
- 常用的加载方法大概有这么几个
1.initWithNibName:bundle: (加载带有XIB控制器)
2.loadView (控制器的View为空的时候调用,帮控制器加载View)
3.initWithCoder: (是当从nib文件中加载对象的时候会调用)
4.awakeFromNib (当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象)
5.initWithFrame: (代码创建View时调用,是懒加载,只有到需要显示时,子控件才不是 nil)
1.让我们先从ViewController的加载说起
Code方式加载ViewController调用的相关方法:
代码创建的ViewController:
ViewControllerWith *vc = [[ViewControllerWith alloc]init];
在这个加载过程中 相关方法调用顺序是:
init
initWithNibName:bundle:
loadView
viewDidLoadXIB的方式加载ViewController调用的相关方法
当command+N创建ViewController的时候勾选了Also create XIB file ,系统就会帮我们创建与ViewController同名的XIB文件
对于这种控制器,常用的创建方式是:ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]initWithNibName:@"ViewControllerWithXib" bundle:nil];
在这个加载过程中 相关方法调用顺序是:
initWithNibName:bundle:
loadView
viewDidLoad当然, 你也可以以下这种方式创建带有XIB的ViewController
ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]init];
这样也能加载出你在xib里面创建的view
前提是你的控制器不能重写loadView方法
因为用这种方式创建 系统会调用loadVIew帮你寻找和类同名的XIB文件加载
你若是重写了loadVIew,那么控制器就是漆黑一片
这种方式和代码创建方式时,函数调用顺序一致StoryBoard中加载ViewController调用的相关方法
在StoryBoard中构建好自己的控制器用以下代码初始化:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"storyboard" bundle:[NSBundle mainBundle]];//这里的bundle 写nil也可以代表是mainBundle
MyViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];在这个加载过程中 相关方法调用顺序是:
initWithCoder:
awakeFromNib
loadView(这个方法结束时 控制器的View的子控件才创建)
viewDidLoad
2.然后是View的加载
Code的方式加载View调用的相关方法
View加载的纯代码的方式:
MyView *view = [[MyView alloc]init];
view加赞完毕的时候
在这个加载过程中 相关方法调用顺序是:
init
initWithFrame:
是init调用了initWithFrame:XIB的方式加载View调用的相关方法
XIB加载方式:
UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]lastObject];
解析一个文件的时候调用(只是创建了view)
在这个加载过程中 相关方法调用顺序是:
initWithCoder:(这个时候子控件没有被创建)
awakeFromNib(这个时候子控件创建完毕, 一般会在这里进一步对View进行初始化)
=========================
init只是加载就行,有没有xib无所谓;
但是initWithNibName需要xib文件,如果该文件不存在则报错:
网上查看了一下,还有和loadNibNamed的区别和联系,暂时我也没用过这个loadNibNamed
内容引用自:http://blog.sina.com.cn/s/blog_7b9d64af01018f2u.html
===================================================
关于 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的类为我们定义的视图控制器类
loadNibNamed要加载的xib的类为NSOjbect。
(比如:甲,乙都买了一个iPhone,但是,甲的是自己的钱,而乙用的是某某的钱)
2.加载方式不同
initWithNibName方法:是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil
loadNibNamed方法:即时加载,用该方法加载的xib对象中的各个元素都已经存在。
(认真理解这句帮规:whenusing loadNibNamed:owner:options:, the File's Owner should be NSObject, themain view should be your class type, and all outlets should be hooked up to theview, not the File's Owner.)
这图配上,上变的图,比翻译中文更加清晰。
谢谢!希望对您有帮助!
===================================================
下面部分转自:http://blog.csdn.net/yanxiaoqing/article/details/7454281
在开发过程中,几次碰到在initWithNibName:nibNameOrNil方法里加载组件或者初始化一些值时,都跟没设置一样,查了一些资料才发现,原来initWithNibName:nibNameOrNil得执行顺序是这样子的
- supper :
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- set param=@“supper-A”
- NSLog(@“A-initNIb”);
- }
- viewDIdLoad
- {
- [super viewDidiLoad];
- NSLog(@“A-view”);
- NSLog(param);
- }
- sub:
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- set param=@“sub-B”
- NSLog(@“B-initNIb”);
- }
- viewDIdLoad
- {
- [super viewDidiLoad];
- NSLog(@“B-View”);
- NSLog(param);
- }
执行sub时输出顺序:
A-initNIb
A-view
supper-A
B-View
supper-A
B-initNIb
sub-initWithNibName: 里调用supper的initWithNibName:
superclass的initWithNibName方法结束,表示nib文件已加载,则调用sub的 viewDidLoad方法。于是应调用[subclass viewDidLoad]方法。
subclass的viewDidLoad方法又调用了supclass的viewDidLoad方法。
最后才是initWithNibName方法剩余的代码
结论,你在sub里面设置的param=sub-B,并没有起作用输出,因为,在设置之前,sub的view已经执行过了,为了避免这样可以改成
- sub
- viewDIdLoad
- {
- NSLog(@“B-View”);
- NSLog(param);
- [super viewDidiLoad];
- }
- - (void)viewDidLoad{
- [selfsetWords:@” pleaseanswer the door”];
- [super viewDidLoad];
- }
==========================
iOS控制器与视图加载方法的更多相关文章
- iOS学习之视图加载过程中会触发的方法(loadView/viewDidLoad/didReceiveMemoryWarning)
1.loadView 这是视图控制器用来加载根视图的方法; 如果需要将自定义的视图作为根视图,则不需要调用父类对该方法的实现([super loadView]);直接将自定义视图通过self.view ...
- iOS UI-(多)视图控制器的生命周期、加载方法和模态视图方法以及屌丝方法
#import "ViewController.h" #import "SecondViewController.h" @interface ViewContr ...
- iOS开发之控制器创建与加载(生命周期)
1.如何创建一个控制器 控制器常见的创建方式有以下几种: (1)通过storyboard创建 (2)直接创建 MJViewController *mj = [[MJViewController all ...
- iOS之深入了解控制器View的加载
前言 在面试中,面试官可能会问这样的问题,loadView有什么作用,它与viewDidLoad有何区别 首先我们得知道,控制器view是通过懒加载的方式进行加载的,即用到的时候再加载. loadVi ...
- IOS 应用程序启动加载过程(从点击图标到界面显示)
今天帮同事解决问题的时候发现,程序BUG是由加载过程引起的.所以当局部代码没有问题,但是程序一运行却总不是我们想要结果的时候,我们应该想想是不是因为我们忽略了试图加载过程的原因.下面我们用一个例子来简 ...
- [Swift通天遁地]一、超级工具-(5)使用UIWebView(网页视图)加载本地页面并调用JavaScript(脚本)代码
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]一、超级工具-(4)使用UIWebView(网页视图)加载HTML和Gif动画
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 控制器View的加载过程
1.控制器内部的view是延迟加载 1> 用到时再加载2> 加载完毕后会调用控制器的viewDidLoad方法 2.创建控制器的方式 1> 直接通过代码创建OneViewContro ...
- IOS 多个UIImageView 加载高清大图时内存管理
IOS 多个UIImageView 加载高清大图时内存管理 时间:2014-08-27 10:47 浏览:59人 当我们在某一个View多个UIImageView,且UIImageView都显示的是 ...
随机推荐
- The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - C 暴力 STL
What Kind of Friends Are You? Time Limit: 1 Second Memory Limit: 65536 KB Japari Park is a larg ...
- Linux系统之路——python多版本共存问题(ps:自行切换python版本,pip安装遇到的一些问题)
经常遇到这样的情况: 系统自带的Python是2.6,自己需要Python 2.7中的某些特性: 系统自带的Python是2.x,自己需要Python 3.x: 此时需要在系统中安装多个Python, ...
- Linux iptables:规则原理和基础
什么是iptables? iptables是Linux下功能强大的应用层防火墙工具,但了解其规则原理和基础后,配置起来也非常简单. 什么是Netfilter? 说到iptables必然提到Netfil ...
- HTML5笔记-加强版
新增的语法结构表单验证 1.新的页面结构以及宽松的语法规范:<!doctype html> <meta charset=“utf-8”/> 2.新的结构化元素:语义化标签: ...
- Android通过php插入查询SQL数据库
PHP代码 <?php header("Content-type: text/html; charset=gb2312"); $serverName = "loca ...
- Win7 32位安装Oracle11g R2 图解示例
Win7 32位操作系统安装Oracle11g R2 图解示例.废话不说了,直接上图. 1.下载的两个oracle 11gR2压缩包解压到单独的文件夹中. 2.找到解压的database文件夹中的Se ...
- 改变你一生的编辑器:VSCode使用总结
开发十年,只剩下这套Java开发体系了 >>> 前言:vscode是微软出品的,基于Electron和TypeScript的,现在已经是最火的一款文本编辑器.我认为vscode是 ...
- 816B. Karen and Coffee 前缀和思维 或 线段树
LINK 题意:给出n个[l,r],q个询问a,b,问被包含于[a,b]且这样的区间数大于k个的方案数有多少 思路:预处理所有的区间,对于一个区间我们标记其(左边界)++,(右边界+1)--这样就能通 ...
- 洛谷 1.5.1 Number Triangles 数字金字塔
Description 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 ...
- CRF原理解读
概率有向图又称为贝叶斯网络,概率无向图又称为马尔科夫网络.具体地,他们的核心差异表现在如何求 ,即怎么表示 这个的联合概率. 概率图模型的优点: 提供了一个简单的方式将概率模型的结构可视化. 通过 ...