视图与控制器之间的关系
父子关系
当使用视图控制器容器时,就会产生拥有父子关系的视图控制器。通过viewControllers
来保存一组视图控制器。
视图控制器容器的特性:
- 容器对象会将viewControllers中的视图作为子视图加入自己的视图。
- 容器视图对象通常都会有自己的默认外观。
- 任何容器对象都可以通过viewControllers访问其子对象。
- 子对象可以通过UIViewController对象的四个特定属性来访问其容器对象:
- 先介绍四个特定属性的前三个:
navigationController,tabBarController,splitViewController
。当某个视图控制器收到这三个消息中的某一个,就会沿着族系向上查找,直到找到类型匹配的视图控制器。如果没找到,返回nil。 - 第四个属性:
parentViewController
,该属性会指向族系中“最近的”那个容器对象。
- 先介绍四个特定属性的前三个:
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
。推荐阅读
- 国产时序数据库IotDB安装、与SpringBoot集成
- 在吃素与吃斋间行走
- 「庐州月」与「燕归巢」
- 深度学习|神经网络讲解与实例,如何理解神经网络
- (原创)我的疑问与请求
- 与 Rust 勾心斗角 · 快没有爱了
- #|Spring Boot 多个MongoDB 数据源配置与实现
- MySQL数据库|MySQL数据库一(MySQL体系结构与存储引擎)
- 美术生的成长与蜕变
- 爱是陪伴与放手,而不是管束和索取