View Controller Relationships
Parent-child relationships
Parent-child relationships are formed when using view controller containers. Examples of view
controller containers are UINavigationController, UITabBarController, and UISplitViewController.
You can identify a view controller container because it has a
viewControllers property that is an array of the view controllers it contains.
View controllers in a parent-child relationship form a family. So, a UINavigationController and its
viewControllers are in the same family. A family can have multiple levels. For example, imagine a
situation where a UITabBarController contains a UINavigationController that contains a
UIViewController. These three view controllers are in the same family. The container
classes have access to their children through the viewControllers array, and the children have access
to their ancestors through four properties of UIViewController.
Every UIViewController has a parentViewController property. This property holds the closest view
controller ancestor in the family. Thus, it could return a UINavigationController,
UITabBarController, or a UISplitViewController depending on the makeup of the family tree.
The ancestor-access methods of UIViewController include navigationController,
tabBarController, and splitViewController. When a view controller is sent one of these messages,
it searches up the family tree (using the parentViewController property) until it finds the appropriate
type of view controller container. If there is no ancestor of the appropriate type, these methods return
nil.
Presenting-presenter relationships
The other kind of relationship is a presenting-presenter relationship, which occurs when a view
controller is presented modally. When a view controller is presented modally, its view is added on
top of the view controller’s view that presented it. This is different than a view controller container,
which intentionally keeps a spot open on its interface to swap in the views of the view controllers it
contains. Any UIViewController can present another view controller modally.
There are two built-in properties for managing the relationship between presenter and presentee. A
modally-presented view controller’s presentingViewController will point back to the view
controller that presented it, while the presenter will keep a pointer to the presentee in its
presentedViewController property.
- First, notice that the properties for parent-child relationships can never cross over family boundaries.
- When a view controller is presented modally, the actual presenter is the oldest member of the presenting family.
This behavior explains why the BNRDetailViewController obscures the UINavigationBar when
presented modally but not when presented normally in the UINavigationController’s stack. Even
though the BNRItemsViewController is told to do the modal presenting, its oldest ancestor, the
UINavigationController, actually carries out the task. The BNRDetailViewController is put on top of
the UINavigationController’s view and thus obscures the UINavigationBar.
You can actually override this oldest-ancestor behavior (but only on the iPad). By doing so, you can
specify where the views of the presented view controller family appear on the screen. For example,
you could present the BNRDetailViewController and its navigationController so that it only
obscures the UITableView but not the UINavigationBar.
Every UIViewController has a definesPresentationContext property for this purpose. By default,
this property is NO, which means the view controller will always pass presentation off to its next
ancestor, until there are no more ancestors left. Setting this property to YES interrupts the search for
the oldest ancestor, allowing a view controller to present the modal view controller in its own view.
Additionally, you must set the modalPresentationStyle for the presented view
controller to UIModalPresentationCurrentContext.
- Notice also that the presentingViewController and presentedViewController are valid for every
view controller in each family and always point to the oldest ancestor in the other family.
View Controller Relationships的更多相关文章
- 【IOS笔记】View Controller Basics
View Controller Basics 视图控制器基础 Apps running on iOS–based devices have a limited amount of screen s ...
- View Controller Programming Guide for iOS---(四)---Creating Custom Content View Controllers
Creating Custom Content View Controllers 创建自定义内容视图控制器 Custom content view controllers are the heart ...
- View Controller Programming Guide for iOS---(三)---Using View Controllers in Your App
Using View Controllers in Your App Whether you are working with view controllers provided by iOS, or ...
- View Controller Programming Guide for iOS---(二)---View Controller Basics
View Controller Basics Apps running on iOS–based devices have a limited amount of screen space for d ...
- View Controller Programming Guide for iOS---(一)---About View Controllers
About View Controllers View controllers are a vital link between an app’s data and its visual appear ...
- iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)
这个问题是什么意思呢,之前遇到过几次,但程序再次打开时没有问题,也就没有重视,今天又遇到了,无法忍受啊. 控制台报的错误是:"不支持多次推入相同的视图控制器实例". 什么原因造成的 ...
- 报错:Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?
原因分析:在StoryBoard中没有一个view controller设置了Initial Scene. 解决方案:在Storyboard中,选择一个view conroller作为story bo ...
- iOS架构师之路:控制器(View Controller)瘦身设计
前言 古老的MVC架构是容易被iOS开发者理解和接受的设计模式,但是由于iOS开发的项目功能越来越负责庞大,项目代码也随之不断壮大,MVC的模糊定义导致我们的业务开发工程师很容易把大量的代码写到视图控 ...
- Model View Controller
On the iPhone or iPod touch, a modal view controller takes over the entire screen. This is the defau ...
随机推荐
- jQuery HTML
alert("Text: " + $("#test").text());获取text alert("HTML: " + $("#t ...
- UML和UP简介(转载)
UML(统一建模语言,Unified Modeling Language)是用于系统的可视化建模语言. UP(统一过程,Unified Process)是通用的软件开发过程. 很多人或书籍过大的夸大 ...
- sqlserver字段类型
bit 整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型, ...
- 反射【类Class、成员变量Field、方法Method】
Class<?> c = Class.forName("main.Main$MyClass"); //要包名+类名 Object obj = c.newInstance ...
- 十分钟搞定微信企业帐号“echostr校验失败,请您检查是否正确解密并输出明文echostr”
问题域:在这里我们只解决密文可以正确解密,但微信验证提示“echostr校验失败,请您检查是否正确解密并输出明文echostr”的问题. 干货:没有正确验证的原因是:你给微信返回的是字符串,而微信需要 ...
- 更改localhost默认打开的index.html的地址三步曲
首先说明,我的Apache安装路径是F:\software installing\Apache2.2 解释一下,localhost默认打开的是安装路径下index.html 也就是路径F:\softw ...
- java JSONObject/JSONArray详解
应用架包:json-lib-2.4-jdk15.jar.及相关依赖架包. 一.JSONObject和JSONArray对象 -------------------------------------- ...
- halcon运行版设置
- Android学习十一:高德地图使用
写这篇文章主要有三个目的: 1.使用高德地图api定位 2.获取天气数据 3.编程练手 文件结构 清单文件信息说明: <?xml version="1.0" encoding ...
- Servlet、JSP中页面跳转的方式
一.Servlet:当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面.1) redirect 方式response.sendRedirect("success ...