awakeFromNib 以及 initWithCoder 小总结
在使用IB的时候才会涉及到此方法的使用,当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。
看例子:
1.创建一个viewController with XIB
2.定义一个UIView的子类
3.打开xib,并把View的类型指定为上一步骤定义的子类
4.然后在TestView.m中加入 awakeFromNib方法,运行程序发现此方法被调用了!!!可以在其中加代码来定义TestView的一些其他特性。
第一句:通过Xcode实例化controller,但controller的类在IB中创建时调用此方法
{
看有这么说的
awakeFromNib是一个只有在GUI对象被成功加载才调用的方法,而init方法是在GUI被创建前就已经调用了。
当程序对Nib文件进行反序列化然后初始化时,会调用一次awakeFromNib。
但是如果你使用initWithNibName调入Nib时,awakeFromNib是不会被调用的。
这个好像不准确!!!
}
第二句:initWithcoder是系统自动调用的,以后说!!!
第三句和第四句:这两局setNeedsDisplay会异步的调用drawRect来更新view的内容,这个我可以理解,但为什么是两句有点不理解,请高手指教
第四句:这句就是awakeFromNib被调用的地方了。
第五句:上述都结束后,view处理好了后就调用viewDidLoad了,所以无论从代码还是从IB加载view都要调用viewDidLoad的。
-----------------------------------------------------------------------------------------------------华丽的分割线------------------------------------------------------------------------------------------------------------
首先,区别程序化初始viewcontroller,半程序化初始和IB初始的区别.
1. 代码化初始:完全没有Xib之类的东西,通过纯代码实现加载.
2. 半代码化:设计xib,然后在程序中用代码调用xib来初始化.
3. 完全IB化:设计xib之类,然后加入到其它xib里.如MainWindow.xib中加入rootviewController,而rootviewcontroller通过xib设计.或者tabbarcontroller中加入多个由xib设计的viewcontroller,这些都是通过IB来
初始化的.
好了,了解了这些,来看看各种方法的使用.
1. viewDidLoad:这个方法在三种方式下都会调用,而且是加载完view后调用.
2. loadView:代码初始化程序时设计view用. 半代码化时和完全IB化初始时亦调用,但会重写xib中的view,调用在initwithNibName之后,viewDidLoad之前.
3. initWithNibName:半代码化初始时使用. 完全IB化初始时不调用,UIViewController代码化初始时会通过init调用,且调用在[super init]中.
4. awakeFromNib:awakeFromNib这个方法是一个类在IB中被实例化是被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用awakeFromNib,应为viewDidLoad会被多次调用,而awakeFromNib只会当从nib文件中unarchive的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.
5.initWithCoder是一个类半代码化实例时被调用的.比如,通过IB创建一个controller的nib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.
调用顺序: [super init](可选)->initWithNibName(其实在super init中) ->int after self created->loadView->ViewDidLoad
浙公网安备 33010602011771号