UIViewController是iOS中使用最多的类,需要了解它的生命周期以及各个阶段方法中应该做哪些事情,它的生命周期中涉及方法主要有以下几个,具体的调用顺序也是如下:
initWithNibName:bundle:
loadView
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear
....
viewWillDisappear
viewDidDisappear
initWithNibName:bundle:
使用code编码时候,UIViewController的指定初始化方法,需要初始化的重要关键的数据.
如果使用storyboard创建VC,那么这个方法不会调用!!!,storyboard会自动初始化或者在segue被触发时候初始化.
如果使用instantiateViewControllerWithIdentifier:
方法显示初始化一个UIViewController,那么此时会调用initWithCoder
,不会调用本方法.
不要在这里创建view,以及执行view相关的操作.因为此时view为nil
loadView
该方法只用来初始化创建VC的view,比如UITableViewController的 tabView等.具体的调用方法如下二选一:
-(void)loadView{
[super loadView];
// 此时view已经被创建,而且它的frame在iPhone 5s上是(0,0,320,568)
// 此时可以使用self.view进行对view属性的修改
}
-(void)loadView{
// 此时不能调用self.view.backgorund = xxx; 因为view是nil
self.view = [[UIView alloc] initWithFrame(xxxx)];
// 此时view已经被创建
}
//实例
-(void)loadView {
CGRect applicationFrame = [[UIScreenmainScreen] bounds];
UIView *contentView = [[UIViewalloc] initWithFrame:applicationFrame];
contentView.backgroundColor = [UIColordarkGrayColor];
self.view = contentView;
}
如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。
loadView虽然返回值为空,但必须在函数体内对self.view进行赋值,否则会报错.
viewDidLoad
在view加载完成时候调用,我们一般在这里进行一些对view属性的设置.
viewWillAppear
在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。
这个方法中完成任何与视图显示相关的任务,比如改变navigationbar的颜色等等.
viewWillLayoutSubviews
在VC的view调用layoutSubviews之前调用.
view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化,VC被添加到NavigationController),要调整subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。
此时如果VC是在navigationController的栈中,那么view的bounds会改变
viewDidLayoutSubviews
在VC的view调用layoutSubviews之后调用.
view已经布局其Subviews。比如view的bounds改变(例如状态栏从不显示到显示,视图方向变化,navigationController),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。
此时可以给view的subviews设置frame.(因为self.view的bounds已经确定了),即使使用autolayout,这里subviews的frame也已经定下了.这里可以进行微调了.
viewDidAppear
在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中,self.view的origin已经被确定,并且将它添加到superview中去了)
在这个方法中执行视图显示相关任务,如果重载了这个方法,必须在方法中调用[super viewDidAppear];
..........
viewWillDisappear
view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview
viewDidDisappear
view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。
http://www.cnblogs.com/skyblue/archive/2013/06/15/3137290.html