iOS开发之旅之UIViewController解析

版权声明:本文为Mr.Simple原创文章,未经允许不得转载。 https://blog.csdn.net/bboyfeiyu/article/details/41623321

就iOS开发来说,UIViewController就最核心的类型之一。而iOS的整个UI开发的核心思想也是MVC的架构,从UIViewController的命名就可以看出它在MVC中所扮演的角色,那就是Controller啦。


Controller作为整个UI视图的控制器,对于用户的输入做出逻辑处理,例如用户点击某个按钮应该执行什么操作等;View角色只负责显示视图,view的这部分就是我们在nib或者storyboard设计的UI了。Model也就是我们的数据模型,例如从Core data中加载的实体类等等。这整个架构分工清晰,降低了代码的耦合度。今天我们要学习的角色就是Controller。

UIViewController与UIWindow、UIView的关系如下 图所示:

UIWindow在现实时会设置一个root controller,然后会将该root controller的root view设置为该window的root view,root view又管理着整个视图的层次结构,这样就构建起了用户界面,并且相互之间耦合性较低。

按照官方的定义,View Controller为iOS提供了基础的视图管理模型,也就是它就是负责管理视图的,管理视图的层级、大小、内容、交互等。iOS的SDK中提供很多原生ViewController,以支持标准的用户界面,例如表视图控制器(UITableViewController)、导航控制器(UINavigationController)、标签栏控制器(UITabbarController)和iPad专有的UISplitViewController等。


        按结构可以对iOS的所有ViewController分成两类:

        1、主要用于展示内容的ViewController这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
        2、用于控制和显示其他ViewController的ViewController这种ViewController一般都是一个ViewController的容器,例如UINavigationController,UITabbarController,它们都有一个属性:viewControllers,将所有要管理的View Controller添加到该数组就就行了,如图1。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,当前ViewController的导航栏上会显示上一个ViewController的Bar Button,点击该bar button可以返回上一个View Controller。而UITabbarController表示一个带有底部栏的视图控制器,底部栏按钮的个数就是ViewController的个数,各个ViewController是并列的,如图2。


                         

图1 图2


UIViewController加载视图

UIViewController有两种加载方式,第一种是通过手动加载xib文件来加载视图,第二种是直接通过代码来创建View Controller中的师徒来加载。直接看示例吧。

方式一 :xib加载

在创建一个xib文件,将File's Owner设置为对应的UIViewController类型,然后关联File's Owner的view与xib中的root view(在创建UIViewController时自动创建了xib的话不需要这一步,只有分开创建时才需要手动建立关联,否则会报错。),然后通过如下代码即可创建:

//    MainViewController *vc=[[MainViewController alloc]initWithNibName:@"MainViewController" bundle:nil];  
//    self.window.rootViewController = vc;  
      
    MainViewController *vc=[[MainViewController alloc] init];  
    self.window.rootViewController = vc; 


方式二:代码添加View

思路就是将View添加到UIViewController的root view中,在UIViewController启动时默认会从与其关联的xib或者storyboard中加载视图,如果没有找到则root view为nil。我们可以覆写loadView方法,通过代码的形式向里面添加view。代码如下 :

// 加载视图时绘制
-(void) loadView
{

    UILabel* label = [[UILabel alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] ;
    label.text = @"Draw The Text";
    label.backgroundColor = [UIColor redColor] ;
    
    self.view = label;
}
然后直接通过alloc和init创建UIVIewController即可。


UIViewController的生命周期

    ViewController生命周期会经历初始化、加载视图、销毁视图、生命结束等过程。

1)init方法

      初始化ViewController本身。

2)loadView方法

      当view需要被展示而它却是nil时,viewController会调用该方法,如果代码构建View的话需要重写此方法。

3)viewDidLoad方法

      执行完loadView后继续执行viewDidLoad,loadView时还没有view,而viewDidLoad时view已经创建好了。

4)viewDidUnload方法

     当系统内存吃紧的时候会调用该方法。

5)dealloc

      释放其他资源或内存。


展开阅读全文

没有更多推荐了,返回首页