IOS开发UI-------视图的生命周期
2016-01-18 17:03
435 查看
这里说视图的生命周期的时候顺便引入APP运行调用方法的顺序
首先单单说视图的生命周期方法调用的顺序,这个是我百度出来的
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];)。
如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。
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中创建的对象进行释放
总流程
1.AppDelegate—-application:
2.ViewController—-loadView
3.ViewController—-viewDidLoad(一般在这里面写代码)
4.ViewController—-viewWillAppear:
5.AppDelegate—-applicationDidBecomeActive:
6.ViewController—-viewWillLayoutSubviews,viewDidLayoutSubviews
7.ViewController—-viewDidAppear:
8.这里身下的就是AppDelegate里面软件在前台和后台,进入和退出的切换时调用的方法了,总共有以下几个方法,详细可以去到工程的AppDelegate文件里面看
总结:
以上就是应用程序在使用的时候会调用的几个方法
和
view的生命周期中所用的方法
。
首先单单说视图的生命周期方法调用的顺序,这个是我百度出来的
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];)。
-(void)loadView{ NSLog(@"loadView"); //错误,将导致死循环,因此此时view=nil,VC会再次调用loadView来初始化view self.view.backgroundColor = [UIColor greenColor]; } -(void)loadView{ NSLog(@"loadView"); //正确,先初始化view self.view =[[MyView alloc] init]; self.view.backgroundColor = [UIColor greenColor]; }
如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。
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中创建的对象进行释放
总流程
1.AppDelegate—-application:
//应用启动并进行初始化的时候调用该方法并发出通知,这个阶段会初始化根视图控制器 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSLog(@"应用启动并进行初始化");
2.ViewController—-loadView
//加载视图的方法 - (void)loadView{ [super loadView]; NSLog(@"加载视图"); }
3.ViewController—-viewDidLoad(一般在这里面写代码)
//在视图控制器已被实例化,还会被加载到内存中时,会调用viewDidLoad,这时视图并没有出现。该方法只调用一次 - (void)viewDidLoad { [super viewDidLoad]; }
4.ViewController—-viewWillAppear:
//将要加载完成视图 - (void)viewWillAppear:(BOOL)animated{ NSLog(@"视图将要出现"); }
5.AppDelegate—-applicationDidBecomeActive:
//应用进入前台并处于活跃状态时调用该方法 - (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"应用已经进入活动状态"); }
6.ViewController—-viewWillLayoutSubviews,viewDidLayoutSubviews
//布局视图(当视图控制器的根视图及其子视图frame发生改变,将会执行) - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; NSLog(@"1"); } - (void)viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; NSLog(@"2"); }
7.ViewController—-viewDidAppear:
//视图已经出现 - (void)viewDidAppear:(BOOL)animated{ NSLog(@"视图已经加载完成"); }
8.这里身下的就是AppDelegate里面软件在前台和后台,进入和退出的切换时调用的方法了,总共有以下几个方法,详细可以去到工程的AppDelegate文件里面看
1. //应用从活跃状态进入非活跃状态时调用该方法并发出通知,这个阶段可以保存UI状态 - (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"从活跃状态进入非活跃状态"); } 2. //应用进入后台时调用该方法并发出通知,这个阶段可以保存用户数据,释放一些资源 - (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"应用已经进入后台"); } 3. //应用进入前台,但是还没有处于活跃状态时调用该方法并发出通知,这个阶段可以恢复用户数据 - (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"应用将要进入前台"); } 4. //应用进入前台并处于活跃状态时调用该方法 - (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"应用已经进入活动状态"); } 5. //应用被终止时调用该方法并发出通知,但内存清除时除外。这个阶段释放一些资源,也可以保存用户数据 - (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"应用被终止"); }
总结:
以上就是应用程序在使用的时候会调用的几个方法
和
view的生命周期中所用的方法
。
相关文章推荐
- JSPatch学习系列-UI基础
- UIAlertController使用
- EasyUI-Combox
- 如何做优化,UITabelView才能更加顺滑
- 设置列表(uitableview)顶端间隙
- Android 5.0 SystemUI
- easyui datagrid 的 tip实现
- UIScrollView直接在StoryBoard中拖控件
- java中的String,StringBuilder,StringBuffer
- javax.servlet.ServletException: java.lang.ClassFormatError: Incompatible magic value 0解决方案
- ArcGIS中QueryTask,FindTask,IndentifyTask 之间的区别
- IOS开发UI-------UIView(视图)
- UIImage 注意事项
- 【从零学习经典算法系列】分治策略实例——高速排序(QuickSort)
- 快排Quick Sort到底有多快?
- You attempted an operation that requires PV drivers to be installed on the VM.
- [iOS]关于状态栏(UIStatusBar)的若干问题
- UESTC--1256
- Divide and conquer:Dropping tests(POJ 2976)
- 果冻回弹效果 拉刷新效果 UIBezierPath