zoukankan      html  css  js  c++  java
  • iOS:viewController 和 view 的生命周期、不错的代码设计风格

      一、介绍:

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

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

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

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

      1.  调用loadView方法,如果实现的话进行调用,重写loadView方法,很容易造成错误,注意loadView的调用时机,loadView常用来手动添加view
      2.  查找StoryBoard,看是否包含该控制器,如果有,加载storyBoard 中的view
      3.  查找xib 文件,先查找该控制器名字Controller前面的字符串组成的名字的xib 文件,如果没有找到,那么查找与Controller 同名的xib 文件
      4.  如果没有找到,那么系统产生一个空白的view 
    4. 控制器和控制器自带的nib之间的关系:

      1.  使用init 方法初始化conroller的时候,先调用initWithNib:bundle方法,然后是init方法,然后直接调用loadView方法,viewDidLoad,viewWillAppear,viewWillLayoutSubviews,viewDidLayoutSubviews,viewDidAppear等等方法,注意没有调用controller的initWithCoder:,awakeFromNib方法 。更正:我发现连当我自己调用loadView 方法时候,viewDidLoad都没有调用,然后在initWIthNib:bundle里面初始化相关的IB连接发现居然是无效的,我在viewDidLayouSubviews:方法中初始化时有效地;所以以后还是不要手动调用loadView方法了
      2.  使用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
    View Code

    三、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
    View Code
  • 相关阅读:
    git cmd 命令在已有的仓库重新添加新的文件夹
    google guava Multimap的学习介绍
    JavaScript笔记基础版
    初识hive
    深入学习HBase架构原理
    初识Azkaban
    MapReduce工作流多种实现方式
    Hive 分组问题
    sqoop使用中的小问题
    Sqoop 结合多种系统的具体应用
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/6724438.html
Copyright © 2011-2022 走看看