视图控制器的View创建方式

UIViewContrller 有三种创建方式:

1.通过alloc init直接创建。

2.通过故事版创建。

3.通过xib文件描述。

 

这是appDelegate.m的内容

  //window的颜色是绿色
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor greenColor];
    
    
    /**
     第一种:直接alloc init 创建控制器,控制器会自动创建一个view,上面什么也没有
     */
   // XBViewController * vc = [[XBViewController alloc]init];
    
    /**
     *  第二种:通过故事版创建控制器,这时候控制器的视图就是故事版上面视图描述的那样
     故事版上面的控制器要和本类进行关联
     */

    UIStoryboard * storyBoard = [UIStoryboard storyboardWithName:@"XBVC" bundle:nil];
    XBViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"XBVC"];
    self.window.rootViewController = vc ;//给根控制器赋值
    
    /**
     第三种:通过xib文件的方式创建
     步骤:
     1.xib的file owner要设置成本类,并且需要手动
     2.进行将本类的view属性个xib上的视图进行关联
     */
    
    XBViewController * vc = [[XBViewController alloc]initWithNibName:@"XBViewController" bundle:nil];
    
    /*当所在的xib的名字和视图控制器本身名字一致的时候直接调用init也会通过
     默认的xib进行创建
     */
    XBViewController * vc  = [[XBViewController alloc]init];
    
    /*
     当没有和控制器的文件名字一样的xib文件,若有XBView这样类型也是可以的
     */
    XBViewController * vc  = [[XBViewController alloc]init];
    
    self.window.rootViewController = vc ;
    [self.window makeKeyAndVisible];//呈现根控制器

 

XBViewController.m

/**
 *  loadView方法里用来建立自己需要的视图,当需要进行延长加载视图的时候可以在这里自己
 定义。只要重写了这个方法,不论控制器是从故事版还是xib创建。统统无效。
 
 这个方法出现在viewDidLoad前,在这里self.view 是空的,需要自己创建
 
 而且必须创建,否则会陷入死循环!!,除非调用了[super loadView];
 
 该方法结束后,必须保证self.view不为空,否则会自己调用自己
 
 */

- (void)loadView
{
//    [super loadView]; //不写这个代码而且不为self.view 创建对象会死机
////    self.view = [[UIView alloc]init];
//    self.view.backgroundColor = [UIColor blueColor];
//    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(20, 300, 300, 30)];
//    label.text=@"现在的视图是loadView里面创建的";
//    [self.view addSubview:label];
   NSLog(@"loadView");
}
//视图加载完成后会调用这个方法,不论是通过系统自己生成的默认的view的方式,还是故事版,xib。
- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(20, 100, 250, 30)];
    label.text=@"这里viewDidLoad里面的view";
    [self.view addSubview:label];
    NSLog(@"视图加载完成");
}

 

/**
 
 当通过init或者xib创建的控制器的时候会调用此方法,故事版不会。
 */
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        /**
         
         如果在这个方法里面给self.view 赋值的话,loadView和viewdidload不会被调用。
         */
        
//        UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
//        view.backgroundColor = [UIColor purpleColor];
//        self.view = view;
    }
    NSLog(@"initWithNibName");
    return self;
}
-(void)viewWillAppear:(BOOL)animated
{
    NSLog(@"viewWillAppear");
}
-(void)viewDidAppear:(BOOL)animated
{
    NSLog(@"viewDidAppear");
}
- (void)viewWillDisappear:(BOOL)animated
{
    NSLog(@"viewWillDisappear");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

 

控制器视图的创建方式:

 

控制器的生命周期图

 

posted @ 2015-12-19 19:34  千里之行始于足下  阅读(310)  评论(0编辑  收藏  举报