视图的生命周期(代码创建时)

- ( BOOL )application:( UIApplication *)application didFinishLaunchingWithOptions:( NSDictionary *)launchOptions
{
    self . window = [[ UIWindow alloc ] initWithFrame :[ UIScreen mainScreen ]. bounds ];
    self . window . backgroundColor = [ UIColor whiteColor ];
   
    CZMainViewController *vc = [[ CZMainViewController alloc ] init ];
    UINavigationController *nav = [[ UINavigationController alloc ] initWithRootViewController :vc];
    // 以下两句等效
    // 控制器的 view 在调用 getter 方法时,如果视图没有创建,会自动调用 loadView 方法
//    vc.view.backgroundColor = [UIColor redColor];
//    [[vc view] setBackgroundColor:[UIColor redColor]];
   
    self . window . rootViewController = nav;
   
    // 让窗口成为主窗口并且可见,只有可见才需要将视图控制器的视图加载出来
    [ self . window makeKeyAndVisible ];
    return YES ;
}




#import "CZMainViewController.h"
#import "CZDetailViewController.h"

@interface CZMainViewController ()
@property ( nonatomic , weak ) UIButton *myButton;

@property ( nonatomic , strong ) NSMutableArray *dataList;
@end

@implementation CZMainViewController

- ( NSMutableArray *)dataList
{
    if (! _dataList ) {
        _dataList = [ NSMutableArray array ];
    }
    return _dataList ;
}

// NSObject 默认的实例化方法
- ( instancetype )init
{
    self = [ super init ];
    if ( self ) {
        NSLog ( @"%s" , __func__);
    }
    return self ;
}

// 视图控制器 默认 的实例化方法
- ( id )initWithNibName:( NSString *)nibNameOrNil bundle:( NSBundle *)nibBundleOrNil
{
    self = [ super initWithNibName :nibNameOrNil bundle :nibBundleOrNil];
    if ( self ) {
        NSLog ( @"%s" , __func__);
    }
    return self ;
}

/**
 *  用代码创建视图时使用,需要建立所有需要显示的子视图,等价于 Storyboard
 *
 *  iOS7 之后的开发中,需要注意的事情:
 
 1> loadView 方法中只是创建控件
 2> viewWillLayoutSubviews 设置控件的位置
 
  这是因为自动布局的引入,每一次视图变化都会调用系统的自动布局系统
 */
- ( void )loadView
{
    NSLog ( @"%s" , __func__);
    self . view = [[ UIView alloc ] init ];
   
    NSLog ( @"%@" , NSStringFromCGRect ( self . view . frame ));
   
    UIButton *btn = [ UIButton buttonWithType : UIButtonTypeContactAdd ];
    [ self . view addSubview :btn];
   
    self . myButton = btn;
   
    [btn addTarget : self action : @selector (click) forControlEvents : UIControlEventTouchUpInside ];
}

- ( void )click
{
    CZDetailViewController *vc = [[ CZDetailViewController alloc ] init ];
   
    [ self . navigationController pushViewController :vc animated : YES ];
}

/**
 *  视图完成加载后被调用
 */
- ( void )viewDidLoad
{
    [ super viewDidLoad ];

    NSLog ( @"%s" , __func__);
   
    NSLog ( @"%@" , self . view . superview );
}

/**
 *  视图即将要显示到屏幕上
 */
- ( void )viewWillAppear:( BOOL )animated
{
    NSLog ( @"%s" , __func__);
    LogFrame ( self . view );
    NSLog ( @"%@" , self . view );
}

/**
 *  视图完全显示在屏幕之上
 */
- ( void )viewDidAppear:( BOOL )animated
{
    NSLog ( @"%s" , __func__);
}

/**
 *  重新布局子视图
 */
- ( void )viewWillLayoutSubviews
{
    NSLog ( @"%s" , __func__);
    self . myButton . center = self . view . center ;
}

// layoutSubViews 方法是定义在 UIView 中的

/**
 *  布局子视图完成
 */
- ( void )viewDidLayoutSubviews
{
}

/**
 *  将要离开界面
 */
- ( void )viewWillDisappear:( BOOL )animated
{
    NSLog ( @"%s" , __func__);
}

/**
 *  已经消失
 */
- ( void )viewDidDisappear:( BOOL )animated
{
    NSLog ( @"%s" , __func__);
}

/**
 *  接收到内存警告
*/
- ( void )didReceiveMemoryWarning
{
    // 父类方法, " 有可能 " 将当前视图给销毁
    [ super didReceiveMemoryWarning ];
   
    // 如果将视图销毁,将所有可以重新创建的资源销毁
    // 将程序中的数据销毁,需要判断视图是否被销毁
    // 使用 isViewLoaded 属性可以判断视图是否真的被加载,如果没有被加载,再销毁数据
    if (! self . isViewLoaded ) {
        self . dataList = nil ;
    }
}

- ( void )dealloc
{
    NSLog ( @"%s" , __func__);
}


//在iOS5以后两个方法都已经淘汰
- ( void )viewWillUnload
{
    NSLog ( @"%s" , __func__);
   
    [ super viewWillUnload ];
}

- ( void )viewDidUnload
{
    NSLog ( @"%s" , __func__);
   
    [ super viewDidUnload ];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值