iOS学习笔记(四)————视图控制器

/ 0评 / 0

在说ViewController(视图控制器)之前呢,我首先简单介绍一下一种比较简单、层次分明,并且在现在软件开发中经常用到的设计模式MVC,M = Model,主要涉及到的是数据模型,方便管理数据的操作,V = View,视图,主要是展示给用户的一些界面,C = Controller,主要是控制视图和模型,作为它们之间的一个桥梁。

在我们未来的项目中,我们主要的操作都是在Controller中进行的,而在OC中主要使用的就是ViewController,控制视图,操作数据,将数据展示在视图上。

而在我们创建一个基于OC的工程时,一般我们都会选择如下图所示的工程

viewcontroller001

这个工程建好之后系统会为我们生成如下图所示的目录结构,

viewcontroller002

默认的就会有一个ViewController,而以后我们的代码也多实现在这里,上一篇我们说到的登录页面就是在这里用纯代码的方式实现的,当然,苹果也为我们提供了一种简单的也是苹果比较推荐的(个人认为)界面搭建方法,使用xib/storyboard创建,也就是傻瓜拖拽式的去创建,下图清晰的展示了xib的使用方式,而storyboard只是xib的一个集合,使用方式差别不大

viewcontroller003

viewcontroller009

两种展示方式与ViewController产生一定的联系之后就可以通过操作数据的代码在试图上展示了。

下面是自定义xib关联 viewController 的方法

viewController007

viewcontroller008

每个viewController里面都包含一个 view ,可以通过 self.view 设置一些属性,而且可以将别的控件添加到这个 view 上:

    //设置view的背景颜色
    self.view.backgroundColor = [UIColor blueColor];
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    btn.frame = CGRectMake(50, 100, 120, 50);
    
    btn.backgroundColor = [UIColor greenColor];
    //将其他控件添加到这个view上
    [self.view addSubview:btn];

我们来简单看一下viewcontroller的生命周期

viewcontroller

一般我们的操作都在红线圈中的一些方法内进行(不全是),就比如我们的创建视图一般写在 viewDidLoad 中,某些请求数据写在 viewWillAppear 或者 viewDidAppear 中,有时候我们也需要操作 viewWillDisappear 和 viewDidDisappear

来看一下例子代码

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blueColor];
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    btn.frame = CGRectMake(50, 100, 120, 50);
    
    btn.backgroundColor = [UIColor greenColor];
    
    [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:btn];
}

- (void)btnClick{
    FXDRegisterViewController *reg = [[FXDRegisterViewController alloc] init];
    
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    
    window.rootViewController = reg;
    
}

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    
    NSLog(@"viewWillAppear");
}

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"viewDidAppear");
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    NSLog(@"viewWillDisappear");
}

- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    NSLog(@"viewDidDisappear");
}

运行结果如下:

viewcontroller006

那系统是如何调用和销毁视图呢?

loadView

viewController004

从图中可以看到,在view加载过程中首先会调用loadView方法,在这个方法中主要完成一些关键view的初始化工作,比如UINavigationViewController和UITabBarController等容器类的ViewController;接下来就是加载view,加载成功后,会接着调用viewDidLoad方法,这里要记住的一点是,在loadView之前,是没有view的,也就是说,在这之前,view还没有被初始化。完成viewDidLoad方法后,ViewController里面就成功的加载view了,如上图右下角所示。
在Controller中创建view有两种方式,一种是通过代码创建、一种是通过Storyboard或Interface Builder来创建,后者可以比较直观的配置view的外观和属性,Storyboard配合IOS6后推出的AutoLayout,应该是Apple之后主推的一种UI定制解决方案。
关于loadView方法的重写,官方文档中有一个明显的注释,原文如下:
Note: When overriding the loadView method to create your views programmatically, you should not call super. Doing so initiates the default view-loading behavior and usually just wastes CPU cycles. Your own implementation of the loadView method should do all the work that is needed to create a root view and subviews for your view controller.
意思是当通过代码方式去创建你自己的view时,在loadView方法中不应该调用super,如果调用[super loadView]会影响CPU性能。

unLoadView

viewController005

从图中可以看到,当系统发出内存警告时,会调用didReceiveMemoeryWarning方法,如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view,完成后调用viewDidUnload方法,至此,view就被卸载了。此时原本指向view的变量要被置为nil。

小结一下:
loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil。

ViewController的生命周期中各方法执行流程如下:
init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc

代码请查看 http://git.oschina.net/zcb1603999/LearningiOS

评论已关闭。