iOS开发之视图控制器(UIViewController)

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

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

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

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

现在有一个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[email protected]"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;
}

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

还有一种简单的方法是使用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

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

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

- (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来执行一些加载时任务。

当需要显示或者访问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。可以重载这个方法来进行额外的清理工作。

官方文档:The View Controller Life Cycle

时间: 2024-10-18 15:50:29

iOS开发之视图控制器(UIViewController)的相关文章

[转]iOS开发之视图控制器(UIViewController)

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

iOS开发中视图控制器ViewControllers之间的数据传递

iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storyboard中传递数据. 首先新建一个空工程,并添加一个根视图控制器类,如下图所示: # 在函数didFinishLunchingWithOption中添加几行代码,完成后如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 - (BOOL)application:(UIApplication

【iOS开发】视图控制器加载和卸载时的几个函数

1.-(void)loadView 你应该永远不要直接调用这个函数.当视图控制器的view属性被请求但是其值为nil时,该函数将会被调用.该函数加载或创建一个视图并把它分配给view属性. 如果视图控制器有一个与之相关联的nib文件,这个方法将会从nib文件中加载视图.当视图控制器的nibName属性的值不是nil时,就说明视图控制器有一个与之相关联的nib文件.如果你直接用initWithNibName:bundle:函数给视图控制器分配一个nib文件或者如果ios发现再应用程序中有一个以视图

IOS开发—禁止视图控制器自动调整status bar的风格

今天项目中的一个问题是当点击第三方库提供的按钮时,由于动画的效果使得status bar字体颜色会自动的变成黑色,但是status bar的背景为黑色,所以看起来就像是status bar消失了一样,但是按钮是第三方库中的内容,无法修改,这里我想到的是禁止status bar中的字体颜色自动改变.具体实现如下: 1.在项目的.plist文件中添加新的key:UIViewControllerBasedStatusBarAppearance 2.设置此key的value为NO 3.在didFinis

iOS开发系列--视图切换

概述 在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单.在iOS开发中常用的视图切换有三种,今天我们将一一介绍: UITabBarController UINavigationController 模态窗口 UITabBarController iOS三种视图切换的原理各不相同: UITabBarController:以平行的方式管理视图,各个视图之间往往关系并不大,每个加入到UITabBarController的视图都会进行初始化即使当前不显示在

iOS开发中标签控制器的使用——UITabBarController

正文 iOS开发中标签控制器的使用——UITabBarController 一.引言 与导航控制器相类似,标签控制器也是用于管理视图控制器的一个UI控件,在其内部封装了一个标签栏,与导航不同的是,导航的管理方式是纵向的,采用push与pop切换控制器,标签的管理是横向的,通过标签的切换来改变控制器,一般我们习惯将tabBar作为应用程序的根视图控制器,在其中添加导航,导航中在对ViewController进行管理. 二.创建一个标签控制器 通过如下的步骤,我们可以很简便的创建一个TabBarCo

iOS开发UI篇—控制器的View的创建

iOS开发UI篇—控制器的View的创建 一.6种创建控制器View的方式 1 #import "NJAppDelegate.h" 2 #import "NJViewController.h" 3 /* 4 1.没有同名xib情况下 5 2.通过 storyboard 创建 6 3.有指定xib情况下创建 7 4.有同名xib情况 8 5.有同名去掉controll的情况 9 6.loadveiw 10 */ 11 @implementation NJAppDele

iOS开发UI篇—控制器的创建

iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中创建一个控制器. 1 #import "YYAppDelegate.h" 2 #import "YYViewController.h" 3 4 @implementation YYAppDelegate 5 6 - (BOOL)application:(UIApplic

Swift - iOS中各种视图控制器(View Controller)的介绍

在iOS中,不同的视图控制器负责不同的功能,采用不同的风格向用户呈现信息.下面对各个视图控制器做个总结: 1,标准视图控制器 - View Controller 这个控制器只是用来呈现内容.通常会用来作为子类,以向屏幕中添加逻辑. 2,导航控制器 - Navigation Controller 这个控制器呈现一个视图控制器的栈,应用程序可以在上面推入更多的视图控制器. 当新视图推入栈,或旧视图弹出栈时,导航控制器会以动画的形式(比如卷动)显示隐藏这些视图. 使用样例:系统“设置”应用程序 3,表