zoukankan      html  css  js  c++  java
  • [转]iOS开发之视图控制器(UIViewController)

    视图控制器应该在MVC设计模式中扮演控制层(C)的角色,UIViewController的职责对内管理与之关联的View,对外跟其他UIViewController通信和协调。一个视图控制器管理一个视图(它可以有子视图),其view属性指向它所管理的视图。UIViewController类可以有子类,可以使用一个系统的UIViewController子类或者直接自己创建一个UIViewController的子类。

    使用代码创建控制器和视图。

    开始创建一个基于窗口的Empty Application的项目。

    UIViewController

    创建一个视图控制器子类:File–New–New File(Command+N)然后选择Objective-C class,命名为RootViewController然后在subclass of中输入UIViewController,单击Next按钮保存。

    UIViewController

    现在有一个RootViewController类,接着编辑它的代码。一个视图控制器负责获得或创建它自己的视图。如果视图控制器手动创建它的视图,必须重载UIViewController类的loadView方法。下面给视图设置一个颜色,放一个“Hello World!”标签在这个视图中。

    @interface RootViewController ()
    
    @end
    
    @implementation RootViewController
    
    -(void) loadView{
    
       // applicationFrame是整个可见区域,不包括状态栏
        UIView* view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
        //设置view的颜色
        view.backgroundColor = [UIColor greenColor];
    
        //添加一个标签
        UILabel* label = [[UILabel alloc] init];
        label.text=@"Hello World!";
    
        //自适应大小
        ;
    
        //居中
        label.center = CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds));
    
        //添加到view
        [view addSubview:label];
    
        //设置self.view = view这样视图控制器就可以管理这个视图了,如果实现了loadView那么就必须设置self.view
        self.view = view;   
    }
    
    ...
    @end

    视图控制器已经准备好,现在准备使用它。我们要调整一下应用程序的委托类(AppDelegate),在应用程序委托类的头文件中,声明视图控制器属性。

    @property (strong, nonatomic) RootViewController *rootViewController;

    在应用程序委托的实现代码中,我们导入”RootViewController.h”,在应用程序委托的application: didFinishLaunchingWithOptions方法中创建新的视图控制器,并把视图放到界面中。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
    
        //创建视图控制器
        RootViewController* theRVC = [[RootViewController alloc]init];
        self.rootViewController = theRVC;
    
        //不仅要创建视图,还必须把视图放到界面中
        [self.window addSubview:self.rootViewController.view];
    
        [self.window makeKeyAndVisible];
        return YES;
    }

    编译并运行应用程序,运行结果如下图所示。

     UIViewController_3

    还有一种简单的方法是使用UIWindow的rootViewController属性。这样就不需要在应用程序委托类的头文件中,声明视图控制器属性。也不需要把视图作为子视图添加到窗口上。当给一个rootViewController属性分配一个UIViewController实例时,它会自动获得UIVIewController的视图,并使它成为窗口的唯一子视图。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
    
        //创建视图控制器
        RootViewController* theRVC = [[RootViewController alloc]init];
    
        // self.rootViewController = theRVC;
        //不仅要创建视图,还必须把视图放到界面中
        //[self.window addSubview:self.rootViewController.view];
    
        //这行代码与上面注释掉的两行代码的效果是一样的。
        self.window.rootViewController = theRVC;
    
        [self.window makeKeyAndVisible];
        return YES;
    }

    窗口的根视图控制器是全局可用的,如果需要获取根视图控制器,可以使用下面的代码:

    UIViewController* rootController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
    在nib文件中创建视图控制器

    在nib文件中设计和维护一个复杂的用户界面比在代码中创建更方便、简单。

    Command+N–User Interface–View,命名为View.xib

    UIViewController_xib

    编辑View.xib,更改File’s Owner的类为RootViewController。这将产生一个view输出口,并把它连接到视图上。(在File’s Owner上单击右键,点击view不放,然后拖动到view上。)

    UIViewController_xib2

    然后修改应用程序委托的相关代码:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
    
        //使用nib文件创建视图控制器
        RootViewController* theRVC = [[RootViewController alloc]initWithNibName:@"View" bundle:nil];
    
        self.window.rootViewController = theRVC;
    
        [self.window makeKeyAndVisible];
    
        return YES;
    }
    UIViewController的初始化
    • 程序请求controller的view
    • 如果view在内存中,则直接加载。相反,如果不存在,则UIViewController调用loadView方法
    • loadView方法执行如下操作:
      • 如果你重载了这个方法,则必须创建必要的view并且将一个非nil值传给UIViewController的view属性。
      • 如果你没有重载这个函数,UIViewController会默认使用UIViewController的nibName和nibBundle属性尝试从nib文件加载view。如果没有找到nib文件,则ViewController会通过以下两个步骤找到与其关联的nib。
        A 如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
        B 找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib。
      • 如果没有可用的nib文件,那么它创建一个空的UIView作为它的view。
    • UIViewController调用viewDidLoad来执行一些加载时任务。

    loading_a_view_into_memory_2x

    当需要显示或者访问view属性时,view没有创建的话,VC就会调用loadView方法,在这个时候会创建一个view并将其赋给VC.view属性。紧接着就会调用VC的viewDidLoad方法,这个时候VC.view保证是有值的,可以做进一步的初始化操作,例如添加一些subview。注意:定制VC时,如果覆盖loadView方法,不需要调用[super loadView]方法。

    UIViewController卸载View的步骤.

    对于与之关联的View,UIViewController总是在需要的时候才加载视图,并在不需要的时候卸载视图,所以也同时担当了管理应用资源的责任。理解UIViewController的生命周期(LifeCycle),能够有效地管理应用资源。Controller的view最好在需要显示时再去加载,并且在系统发出内存警告时释放比必要的view及相关的数据对象。UIViewController卸载View的步骤如下:

    • 程序收到内存警告
    • 每个UIViewController调用didReceiveMemoryWarning, 默认会安全地释放掉view
    • 如果UIViewController释放掉了它的view,它会调用viewDidUnload。可以重载这个方法来进行额外的清理工作。

     unloading_a_view_controllers_view_2x

    原文地址:http://liuzhichao.com/p/1408.html

  • 相关阅读:
    Sqlserver 实际开发中表变量的用法
    Python Day 20 面向对象 (面向对象的组合用法,面向对象的三大特性
    Python Day 19 面向对象(初识面向对象)
    Python Day 18 常用模块(模块和包)
    Python Day 17 常用模块(常用模块一 时间模块,random模块,os模块,sys模块,序列化模块)
    Python Day 15 函数(递归函数、二分查找算法)
    Python Day 14 函数(内置函数,匿名函数(lambda表达式))
    Python Day 13 函数(迭代器,生成器,列表推导式,生成器表达式)
    Python Day 11 + Python Day 12 函数(函数名的应用,闭包,装饰器)
    Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)
  • 原文地址:https://www.cnblogs.com/congliang/p/3832698.html
Copyright © 2011-2022 走看看