视图与控制器之间的关系

父子关系

当使用视图控制器容器时,就会产生拥有父子关系的视图控制器。通过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。

在显示与被显示关系中,位于关系的两头的视图控制器不会处于同一个族系中。被显示的视图控制器会有自己的族系。

如上图所示,凡是针对父子关系的属性,其指向的对象都会在当前族系的范围内。因此,向族系2中的视图控制器发送UITabBarController对象,会返回nil。

不同族系中的视图控制器关系: 当应用以模态形式显示某个视图控制器时,负责显示该视图控制器的将是相关族系中的顶部视图控制器(以上图为例,族系2中的视图控制器的presentingViewController的属性指向的都是UITabBarController对象)。

通过编写代码,可以改变这种“顶部对象负责以模态形式显示其他视图控制器”的行为(仅限iPad)。这样就可以限定视图的显示位置。

为此,UIViewController提供了definesPresentationContext属性,其默认值是NO,当为NO时,会将“显示权”传递给父视图控制器,并沿族系依次向上传递,直到最顶层视图控制器。相反,如果在传递过程中,如果某个视图控制器的definesPresentationContext是YES,该视图控制器就不会再将“显示权”传递给父视图控制器,而是由自己负责新的视图控制器。此外,对于这种情况,必须将需要显示的视图控制器的modalPresentationStyle属性设置为UIModalPresentationCurrentContext

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值