UIWindow、UIView、UIViewController的关系

转自hcios

一、概念简述

VCPG-root-view-controller_2-1_2x

1.1 UIWindow

  • UIWindow是一个特殊的UIView,UIWindow类继承自UIView;
  • 一般来说,一个App只有一个UIWindow,但特定情况下也会出现多个UIWindow,例如,键盘弹出的情况下,就会存在多个UIWindow;
  • iOS启动完毕后,创建的第一个视图控件就是UIWindow,此时需要给UIWindow对象制定根控制器rootViewController属性,系统会自动把rootViewController.view添加到window上(addSubview:方法),显示出来;
  • 只要UIWindow对象存在,即App未被销毁,则rootViewcontroller就不会被销毁。

1.2 UIView

  •  每个UIView都负责在屏幕上定义个矩形区域的显示,可以用设置backgroundColor属性来查看矩形的大小;
  • 每个UIView对象都要负责渲染视图矩形区域内的内容,并且响应该区域中发生的触碰事件;
  • 每个UIView对象中都可以添加一个或多个子UIView对象;
  • UIView对象显示在UIWindow上,用户才能看到界面的样式。
  • 通过view.window属性,可以获得某个UIView所在的UIWindow。

1.3 UIViewController

  •  每个UIViewController都有一个view属性,来显示该控制器的样式;
  • UIViewController负责管理在view上显示的数据,并协调他们和应用程序其他部分的关系;
  • UIViewController类负责创建其管理的视图及在低内存时将它们从内容中移出(didReceiveMemoryWarning方法中实现);
  • 视图控制器还为某些标准的系统行为提供自动响应。比如,在响应设备方向变化时,如果应用程序支持该方向,视图控制器可以对其管理的视图进行尺寸调整,使其适应新的方向。

二、关系描述

2.1 普通控制器的显示与移除

VCPG-presented-view-controllers_2-3_2x

  • 显示一个普通类型的控制器可以使用如下方法
 
 
  1. - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion;
  • 移除一个普通类型的控制器可以使用如下方法
 
 
  1. - (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ __nullable)(void))completion ;
  • 控制器被移除后,立即被销毁;
  • (重要)如上图所示,如果执行多次presentViewController:操作,新显示的控制器view会覆盖之前的控制器view,但旧的控制器view不会销毁,而是会被隐藏,直至执行了dismissViewControllerAnimated:方法,才会被销毁。

2.2 容器型控制器的显示与移除

 VCPG-container-acting-as-root-view-controller_2-2_2x

  • 常见的容器型控制器有:UINavigationController,UITabbarController;
  • 容器型控制器的显示,会把多个子控制器view组合起来显示;
  • UINavigationController使用如下方法切换控制器:
 
 
  1. - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
  2. - (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;
  3. - (nullable NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
  4. - (nullable NSArray *)popToRootViewControllerAnimated:(BOOL)animated;

 

2.3 普通控制器与容器型控制器组合显示

VCPG-container-and-presented-view-controller_2-4_2x

  • 对于普通控制器和容器型控制器组合显示的情况,如果普通控制器是使用present方法显示的话,会覆盖之前的容器型控制器view。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值