iOS:viewController 和 view 的生命周期、不错的代码设计风格
一、介绍:
viwe和viewController的生命周期是最基本的知识,如果很好地理解它们的方法调用的执行顺序,就能很好地设计代码的风格。这篇博客转载自:http://www.cnblogs.com/peaceWang/p/5346726.html。有时间我会在此基础上完善,具体讲述一下每一个方法中最适合执行的操作。
控制器创建的生命周期
. 如果从stroryBoard 中产生一个controller,那么会先调用initWithCoder:, awakeFromNib, loadView,viewDidLoad,viewWillAppear,viewWillLayoutSubviews,不会调用init方法。
. 如果从代码中产生一个ViewController,那么会调用init方法,loadView,viewDidLoad,viewWillAppear,viewWillLayoutSubviews等自定义view创建的生命周期
. 如果是从nib中产生,那么会调用view的initWithCoder:,awakeFromNib,layouSubviews方法,不会调用initWithFrame: 方法
. 如果代码产生,那么会调用view的init ,initWithFrame: ,layoutSubviews方法控制器view的加载方式:
. 调用loadView方法,如果实现的话进行调用,重写loadView方法,很容易造成错误,注意loadView的调用时机,loadView常用来手动添加view
. 查找StoryBoard,看是否包含该控制器,如果有,加载storyBoard 中的view
. 查找xib 文件,先查找该控制器名字Controller前面的字符串组成的名字的xib 文件,如果没有找到,那么查找与Controller 同名的xib 文件
. 如果没有找到,那么系统产生一个空白的view控制器和控制器自带的nib之间的关系:
. 使用init 方法初始化conroller的时候,先调用initWithNib:bundle方法,然后是init方法,然后直接调用loadView方法,viewDidLoad,viewWillAppear,viewWillLayoutSubviews,viewDidLayoutSubviews,viewDidAppear等等方法,注意没有调用controller的initWithCoder:,awakeFromNib方法 。更正:我发现连当我自己调用loadView 方法时候,viewDidLoad都没有调用,然后在initWIthNib:bundle里面初始化相关的IB连接发现居然是无效的,我在viewDidLayouSubviews:方法中初始化时有效地;所以以后还是不要手动调用loadView方法了
. 使用initWithNib:bundle方法初始化controller,不会调用init,然后直接调用loadView方法,viewDidLoad,viewWIllAppear,viewWillLayoutSubviews,viewDidLayoutSubviews,viewDidAppear等方法,不会调用controller的initWithCoder:,awakeFromNib等方法,这点很容易犯错有时候只有一个xib自定义的view 添加到控制器view的时候,我们可以直接将该xib 作为控制器的view, 设置owner; 也可以在loadview中将新的view 赋值给viewController.view
二、view中不错的代码设计风格如下:
#pragma mark - life cycle -(instancetype)init
{
if (self = [super init]) {
[self setup];
}
return self;
} -(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
} -(instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self setup];
}
return self;
} -(void)awakeFromNib{
[super awakeFromNib];
[self setup];
} -(void)setup
{
[self setDefalut];
[self addSubViews];
[self setupSubviewsConstraints];
} -(void)setDefalut{ } #pragma mark - add subViews
-(void)setupSubViews{ } #pragma mark - layout subviews
-(void)setupSubviewsConstraints { } -(void)layoutSubviews{
[super layoutSubviews];
} #pragma mark - event response #pragma mark - public methods #pragma mark - private methods #pragma mark - getters and setters
三、viewController中不错的代码设计风格如下:
#pragma mark - life cycle
- (void)viewDidLoad {
[super viewDidLoad];
[self setupNavigation];
[self setupDefaultValue];
[self setupSubviews];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
-(void)setupNavigation
{
}
-(void)setupDefaultValue
{
}
-(void)setupSubviews
{
}
#pragma mark - layout subviews
-(void)setupSubviewsConstraints {
}
#pragma mark - load data
#pragma mark - delegate methods
#pragma mark - event response
#pragma mark - public methods
#pragma mark - private methods
#pragma mark - getters and setters
iOS:viewController 和 view 的生命周期、不错的代码设计风格的更多相关文章
- 在ViewController中View的生命周期
view的生命周期如下(按顺序) -(void)loadView 用代码初始化的时候,第一个调用该方法.可以在这里面addSubView. -(void)viewDidLoad 初始化时一些数据的设置 ...
- View的生命周期
当一个进入一个新viewController的时候,viewController的view的生命周期一般是这样的: 1.先判断内存是否有这个View a.没有的话:生命周期为loadView-> ...
- iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期
一.导航控制器出栈 1.initWithRootViewController本质 UIViewController *vc = [[OneViewController alloc] init]; // ...
- iOS:捋一遍View的生命周期
一.介绍 前面介绍了VC的生命周期,闲着没事也来捋一捋View的生命周期,简单用两个类型的View来监测.一个View纯代码创建,另一个View使用Xib创建. 二 .代码 MyCodeView: ...
- iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建)
iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建) 一.UITabBarController在storyoard中得搭建 1.新建一个项目,把storyb ...
- 创建控制器的方法、控制器加载view过程、控制器view的生命周期、多控制器组合
在介绍四大对象的那篇博客中,可以基本了解到程序启动的过程: main-->UIApplicationMain-->创建UIApplication的实例和app代理AppDelegate的实 ...
- iOS UI-(多)视图控制器的生命周期、加载方法和模态视图方法以及屌丝方法
#import "ViewController.h" #import "SecondViewController.h" @interface ViewContr ...
- Cordova - 使用Cordova开发iOS应用实战2(生命周期、使用Safari调试)
Cordova - 使用Cordova开发iOS应用实战2(生命周期.使用Safari调试) 前文我们创建了一个简单的Cordova项目,结构如下: 1,Cordova生命周期事件 (1)device ...
- [转] IOS中AppDelegate中的生命周期事件的调用条件
IOS中AppDelegate中的生命周期事件的调用条件 //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResign ...
随机推荐
- vc++ 在程序中运行另一个程序的方法
在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec,ShellExecute ,Creat ...
- [HDU4123]Bob’s Race
题目大意:给定一棵$n$个点并且有边权的树,每个点的权值为该点能走的最远长度,并输入$m$个询问,每次询问最多有多少个编号连续的点,他们的最大最小点权差小于等于$Q$. 思路:两趟DP(DFS)求出每 ...
- BZOJ4280 : [ONTAK2015]Stumilowy sad
线段树每个区间维护上下界以及要整体增加的标记即可,时间复杂度$O(m\log n)$. #include<cstdio> #define inf 1500000000 int n,m,op ...
- Hystrix简单介绍
Netflix的Hystrix是一个帮助解决分布式系统交互超时处理和容错的类库,同样拥有保护系统的能力. 服务隔离 服务降级 1.服务隔离 在一个系统中,一个业务通常会依赖多个服务,且这若干个服务的调 ...
- Codeforces Round #394 (Div. 2) A. Dasha and Stairs 水题
A. Dasha and Stairs 题目连接: http://codeforces.com/contest/761/problem/A Description On her way to prog ...
- 使用 IntraWeb (26) - 基本控件之 TIWMenu
TIWMenu 的任务是让原来的 TMainMenu 呈现在网页上, 通过其 AttachedMenu 属性关联一个 TMainMenu 是必需的. TIWMenu 所在单元及继承链: IWCompM ...
- getRequestURI,getRequestURL的区别(转)
test1.jsp======================= <a href ="test.jsp?p=fuck">跳转到test2</a> test2 ...
- HDU 4453 Looploop (伸展树splay tree)
Looploop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- STM32 Seminar 2007 -- Timer
- Nginx FastCGI的运行原理
http://www.cnblogs.com/yinshoucheng-golden/p/6474034.html