免费开源的iOS开发学习平台

UIWindow、UIView与UIViewController: 2-关系描述

以我们使用浏览器浏览网页打个比喻,假设我们只有一台显示器,该显示器在一个时间点只能显示一个网页的内容,我们可以通过切换浏览器上的页面标签来切换显示在显示器上的网页内容,切换网页的动作需要用户手工操作完成。UIWindow、UIView与UIViewController的角色放到上面的例子中就是,UIWindow相当于显示器屏幕,UIView相当于不同的网页,UIViewController相当于控制网页切换的用户。

普通控制器的组合显示

在UIViewController类中提供了用户控制器显示与移除的方法,在UIWindow中显示的界面其实是多个UIViewController对象view视图的叠加效果。通过调用presentViewController:方法,可以显示一个新的控制器,而调用dismissViewControllerAnimated:会移除当前显示的控制器,控制器被移除后,该控制器对象会被立即销毁。如果执行多次presentViewController:操作,新显示的控制器view会覆盖之前的控制器view,但旧的控制器view不会销毁,而是会被隐藏,直至执行了dismissViewControllerAnimated:方法才会被销毁。

容器型控制器的组合显示

Apple把控制器分为两大类,内容型控制器和容器型控制器,常见的容器型控制器有:UINavigationController,UITabbarController。容器型控制器的显示,会把多个子控制器view组合起来显示,用户看到的其实是多个控制器的样式组合后的结果。例如,导航控制器显示的最终效果其实是导航栏与其管理的子控制器视图叠加后的效果,用户看到的就是屏幕顶部是导航栏,其他部分是子控制器视图的样式。

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

对于普通控制器和容器型控制器组合显示,例如一个导航控制器调用presentViewController:方法来显示一个普通的内容型控制器,此时,内容控制器的视图会覆盖整个导航控制器的组合视图。