热门搜索 :
考研考公
您的当前位置:首页正文

UIViewController生命周期学习笔记

来源:东饰资讯网

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。

Top