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

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

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

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

UIViewController

UIViewController

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

UIViewController

UIViewController

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

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

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

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

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

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

UIViewController_3

UIViewController运行结果

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

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

窗口的根视图控制器是全局可用的,如果需要获取根视图控制器,可以使用下面的代码:
UIViewController* rootController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

在nib文件中创建视图控制器

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

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

UIViewController_xib

UIViewController_xib

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

UIViewController_xib2

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

 
 
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  4. // Override point for customization after application launch.
  5. self.window.backgroundColor = [UIColor whiteColor];
  6. //使用nib文件创建视图控制器
  7. RootViewController* theRVC = [[RootViewController alloc]initWithNibName:@"View" bundle:nil];
  8. self.window.rootViewController = theRVC;
  9. [self.window makeKeyAndVisible];
  10. return YES;
  11. }

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

    unloading_a_view_controllers_view

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值