一、介绍:

viwe和viewController的生命周期是最基本的知识,如果很好地理解它们的方法调用的执行顺序,就能很好地设计代码的风格。这篇博客转载自:http://www.cnblogs.com/peaceWang/p/5346726.html。有时间我会在此基础上完善,具体讲述一下每一个方法中最适合执行的操作。

  1. 控制器创建的生命周期

    .  如果从stroryBoard 中产生一个controller,那么会先调用initWithCoder:, awakeFromNib, loadView,viewDidLoad,viewWillAppear,viewWillLayoutSubviews,不会调用init方法。
    . 如果从代码中产生一个ViewController,那么会调用init方法,loadView,viewDidLoad,viewWillAppear,viewWillLayoutSubviews等
  2. 自定义view创建的生命周期

     . 如果是从nib中产生,那么会调用view的initWithCoder:,awakeFromNib,layouSubviews方法,不会调用initWithFrame: 方法
    . 如果代码产生,那么会调用view的init ,initWithFrame: ,layoutSubviews方法
  3. 控制器view的加载方式:

    .  调用loadView方法,如果实现的话进行调用,重写loadView方法,很容易造成错误,注意loadView的调用时机,loadView常用来手动添加view
    . 查找StoryBoard,看是否包含该控制器,如果有,加载storyBoard 中的view
    . 查找xib 文件,先查找该控制器名字Controller前面的字符串组成的名字的xib 文件,如果没有找到,那么查找与Controller 同名的xib 文件
    . 如果没有找到,那么系统产生一个空白的view
  4. 控制器和控制器自带的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等方法,这点很容易犯错
  5. 有时候只有一个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 的生命周期、不错的代码设计风格的更多相关文章

  1. 在ViewController中View的生命周期

    view的生命周期如下(按顺序) -(void)loadView 用代码初始化的时候,第一个调用该方法.可以在这里面addSubView. -(void)viewDidLoad 初始化时一些数据的设置 ...

  2. View的生命周期

    当一个进入一个新viewController的时候,viewController的view的生命周期一般是这样的: 1.先判断内存是否有这个View a.没有的话:生命周期为loadView-> ...

  3. iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期

    一.导航控制器出栈 1.initWithRootViewController本质 UIViewController *vc = [[OneViewController alloc] init]; // ...

  4. iOS:捋一遍View的生命周期

    一.介绍 前面介绍了VC的生命周期,闲着没事也来捋一捋View的生命周期,简单用两个类型的View来监测.一个View纯代码创建,另一个View使用Xib创建. 二 .代码 MyCodeView:  ...

  5. iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建)

    iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建)   一.UITabBarController在storyoard中得搭建 1.新建一个项目,把storyb ...

  6. 创建控制器的方法、控制器加载view过程、控制器view的生命周期、多控制器组合

    在介绍四大对象的那篇博客中,可以基本了解到程序启动的过程: main-->UIApplicationMain-->创建UIApplication的实例和app代理AppDelegate的实 ...

  7. iOS UI-(多)视图控制器的生命周期、加载方法和模态视图方法以及屌丝方法

    #import "ViewController.h" #import "SecondViewController.h" @interface ViewContr ...

  8. Cordova - 使用Cordova开发iOS应用实战2(生命周期、使用Safari调试)

    Cordova - 使用Cordova开发iOS应用实战2(生命周期.使用Safari调试) 前文我们创建了一个简单的Cordova项目,结构如下: 1,Cordova生命周期事件 (1)device ...

  9. [转] IOS中AppDelegate中的生命周期事件的调用条件

    IOS中AppDelegate中的生命周期事件的调用条件 //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResign ...

随机推荐

  1. ADNI以及study design简介

    相关名词: MCI:轻度认知功能障碍 EMCI:早期认知障碍 MCI:轻度认知障碍 LMCI:晚期认知障碍 CN:认知正常的志愿者 DTI:doppler tissue imaging,多普勒组织显像 ...

  2. 001.LVM简介

    一 概念 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上集合,相 ...

  3. Python3 计算相关系数

    # -*- coding: utf-8 -*- """ Created on Mon Jan 8 19:36:48 2018 @author: markli " ...

  4. ArduinoYun教程之Arduino编程环境搭建

    ArduinoYun教程之Arduino编程环境搭建 Arduino编程环境搭建 通常,我们所说的Arduino一般是指我们可以实实在在看到的一块开发板,他可以是Arduino UNO.Arduino ...

  5. HTML5开启浏览器桌面通知 Web Notification

    说明: 1.Chrome要求必须https才可以开启浏览器通知 2.显示图片在本服务器,不支持跨越 3.自定义声音Chrome不播放,Firefox正常播放 代码如下: <!-- /** * @ ...

  6. 做了一个可定制的英文记忆字典 - RDict

    RDict_1.0 下载 在我自己试用过程中, 随时发现了不少小问题, 我会随时更新下.

  7. IMG镜像写盘工具physdiskwrite,用于MikroTik RouterOS的安装(Windows)

    常用img的备份: 1.linux下使用dd,Windows下使用WinImage 2.或者还有很多,比如再生龙等等. img还原: 1.Win32DiskImager 2.physdiskwrite ...

  8. MikroTik RouterOS使用SATA光驱安装时提示:no CD-ROM found press ENTER to reboot

    可以尝试以下方式: 1.进入bios--Main--Storage configuration,找到SATA configuration ,设置为Compatible模式(即兼容模式.混合模式) 2. ...

  9. 在Win7中用ftp的方法

    我的电脑是Win7  32位操作系统,之前一直没有成功使用过ftp 之初以为是ftp客户端的问题,换了几个软件都不行,然后换我的一台vps服务器(win2003)连接同一个ftp服务器可以正常连接使用 ...

  10. .NET 开源Protobuf-net从入门到精通

    <.NET 开源Protobuf-net从入门到精通>课程包含以下两个部分: 一..NET 开源Protobuf-net组件[数据存储篇] 本次分享课程包含以下干货知识点: 1.什么是Pr ...