UIViewController中各方法调用顺序及功能详解
2016-01-08 19:23
417 查看
UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear,
viewDidDisappear方法,按照调用顺序说明如下:
调试日志:
1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib
如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。
当VC的view对象载入内存后调用,用于对view进行额外的初始化操作
在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等
在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用
view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。
view已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。
view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。
view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。
在VC的view对象从内存中释放之前调用,可以在view被释放前做一些资源清理操作。在iOS6.0开始就废弃了,该方法不再会调用
在VC的view对象从内存中释放之后调用,可以在view被释放后做一些view相关的引用清理操作,此时view为nil。在iOS6.0开始就废弃了,该方法不再会调用
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
viewDidDisappear方法,按照调用顺序说明如下:
调试日志:
123456789 | 2013-07-1412:15:49.048VCTest[13412:907]initWithNibName:bundle / initWithCoder#如果使用的StoryBoard2013-07-1412:15:49.056VCTest[13412:907]loadView2013-07-1412:15:49.059VCTest[13412:907]viewDidLoad2013-07-1412:15:49.061VCTest[13412:907]viewWillAppear2013-07-1412:15:49.078VCTest[13412:907]viewWillLayoutSubviews2013-07-1412:15:49.083VCTest[13412:907]viewDidLayoutSubviews2013-07-1412:15:49.445VCTest[13412:907]viewDidAppear2013-07-1412:16:00.624VCTest[13412:907]viewWillDisappear2013-07-1412:16:00.997VCTest[13412:907]viewDidDisappear |
1. initWithNibName:bundle:
初始化UIViewController,执行关键数据初始化操作,注意这里不要做view相关操作,view在loadView方法中才初始化,这时loadView还未调用。如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle:不会被调用。如果在代码里面使用instantiateViewControllerWithIdentifier:方法显示初始化一个UIViewController,则initWithCoder方法会被调用。如果是通过调用initWithNibName:bundle指定nib文件名初始化的话,ViewController会根据此nib来创建View。如果name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib:1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib
2. loadView
当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[supper loadView];)。
1 2 3 4 5 6 7 8 9 10 11 12 | -(void)loadView{ NSLog(@"loadView"); //错误,将导致死循环,因此此时view=nil,VC会再次调用loadView来初始化view self.view.backgroundColor=[UIColorgreenColor]; } -(void)loadView{ NSLog(@"loadView"); //正确,先初始化view self.view=[[MyViewalloc]init]; self.view.backgroundColor=[UIColorgreenColor]; } |
3. viewDidLoad
当VC的view对象载入内存后调用,用于对view进行额外的初始化操作
4. viewWillAppear
在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等
5. viewDidAppear
在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper viewDidAppear];
6. viewWillLayoutSubviews
view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。
7. viewDidLayoutSubviews
view已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。
8. viewWillDisappear
view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。
9. viewDidDisappear
view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。
10. viewWillUnload
在VC的view对象从内存中释放之前调用,可以在view被释放前做一些资源清理操作。在iOS6.0开始就废弃了,该方法不再会调用
11. viewDidUnload
在VC的view对象从内存中释放之后调用,可以在view被释放后做一些view相关的引用清理操作,此时view为nil。在iOS6.0开始就废弃了,该方法不再会调用当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
相关文章推荐
- WPF--调用线程必须为 STA,因为许多 UI 组件都需要(转载)
- WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
- 使用Queryable.Join实现多表连接查询
- 关于UITableView的一些细小的知识点总结(持续更新)
- H5之mui如何增加自定义icon图标
- UI课程(事件手势/阻断影响者链/手势)
- mysql中key 、primary key 、unique key 与index区别
- UIView基础
- 利用UIBezierPath实现的橡皮筋动画效果(OC版)
- 使用Fluent API 配置/映射属性和类型
- 2DxFX 1.6修正版,支持UGUI的Image组件
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
- Code First 关系 Fluent API
- [Warning] Buffered warning: Changed limits: max_connections: 214 (requested 2000)
- UIResponder - 3
- UITextField,UITextView实现键盘的自动隐藏以及遮挡时自动上移的功能
- iOS开发 UI 自定义视图
- iOS UI-界面传值(三种方法)
- iOS 当页面中没有数据的时候出现的一个指向创建按钮的 UIView
- POJ Ultra-QuickSort