视图与控制器之间的关系

父子关系 当使用视图控制器容器时,就会产生拥有父子关系的视图控制器。通过viewControllers来保存一组视图控制器。
视图控制器容器的特性:

  • 容器对象会将viewControllers中的视图作为子视图加入自己的视图。
  • 容器视图对象通常都会有自己的默认外观。
处在同一个父子关系下的视图控制器形成一个族系:
  • 任何容器对象都可以通过viewControllers访问其子对象。
  • 子对象可以通过UIViewController对象的四个特定属性来访问其容器对象:
    1. 先介绍四个特定属性的前三个:navigationController,tabBarController,splitViewController。当某个视图控制器收到这三个消息中的某一个,就会沿着族系向上查找,直到找到类型匹配的视图控制器。如果没找到,返回nil。
    2. 第四个属性:parentViewController,该属性会指向族系中“最近的”那个容器对象。
显示与被显示关系(presenting-presenter relationship) 当某个视图控制器以模态(modal)形式显示另一个视图控制器时,就会产生拥有这种关系的视图控制器。当某个视图控制器A以模态形式显示另一个视图控制器B时,
B的视图会覆盖A的视图。这和之前介绍的父子关系不同,父子关系的子视图只会在容器对象的视图内显示。
当某个视图控制器A以模态形式显示另外一个视图控制器B时,A的presentedViewController会指向B,而B的presentingViewController属性会指向A。
IMG_5833(20171006-175254).jpg 【视图与控制器之间的关系】在显示与被显示关系中,位于关系的两头的视图控制器不会处于同一个族系中。被显示的视图控制器会有自己的族系。
如上图所示,凡是针对父子关系的属性,其指向的对象都会在当前族系的范围内。因此,向族系2中的视图控制器发送UITabBarController对象,会返回nil。
不同族系中的视图控制器关系:
当应用以模态形式显示某个视图控制器时,负责显示该视图控制器的将是相关族系中的顶部视图控制器(以上图为例,族系2中的视图控制器的presentingViewController的属性指向的都是UITabBarController对象)。
通过编写代码,可以改变这种“顶部对象负责以模态形式显示其他视图控制器”的行为(仅限iPad)。这样就可以限定视图的显示位置。
为此,UIViewController提供了definesPresentationContext属性,其默认值是NO,当为NO时,会将“显示权”传递给父视图控制器,并沿族系依次向上传递,直到最顶层视图控制器。相反,如果在传递过程中,如果某个视图控制器的definesPresentationContext是YES,该视图控制器就不会再将“显示权”传递给父视图控制器,而是由自己负责新的视图控制器。此外,对于这种情况,必须将需要显示的视图控制器的modalPresentationStyle属性设置为UIModalPresentationCurrentContext

    推荐阅读