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 ...
随机推荐
- C语言数据结构之 简单选择排序
算法:设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟 后就完成了记录序列的排序. 编译器: ...
- android共享内存
在android下不能通过shm_open使用共享内存. 网上有好多关于android下使用Ashmem实现共享内存的,但经过尝试该方法可以mmap出内存,但是和另一个进程没有实现共享. 具体的使用方 ...
- HttpClientUtil简介
使用HttpClient发送请求.接收响应. http协议可以说是现在Internet上面最重要,使用最多的协议之一了,越来越多的java应用需要使用http协议来访问网络资源,HttpClient ...
- LINUX测试环境部署manggo(六)
安装配置manggo 复制安装包mongodb-linux-x86_64-2.6.5.tgz到/usr/local/目录下,或者如果有网络可以直接使用wget命令下载安装包到/usr/local目录下 ...
- 将网页另存为PDF文件的方法
使用google chrome浏览器测试,其他浏览器应该也是差不多的方法. 步骤1: 打开需要转换的网页: 步骤2: 点击右上角的三点按键,或者快捷键Ctrl+P,调用的打印页面: 步骤3: 选择目标 ...
- PHP 类中的魔术方法
定义: PHP类中以两个下画线“__”开头的方法被称为魔术方法. 分类: 例如:构造方法:__construct:析构方法:__destruct:动态重载:__set().__get().__call ...
- linq group by子句
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JSBinding+Bridge.NET限制
限制: 框架代码不可以访问逻辑代码.这是最基本的. 框架里的函数 f 带数组参数时,逻辑代码调用 f 的话,数组只能做为输入,也就是说,如果在框架函数 f 里修改了数组的内容,那么逻辑代码是无法取得新 ...
- 【转载】Python 描述符简介
来源:Alex Starostin 链接:www.ibm.com/developerworks/cn/opensource/os-pythondescriptors/ 关于Python@修饰符的文章可 ...
- Eclipse中将Java项目转换成Web项目的方法
前言: 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行. 方法: 1.找到.project文件,找到里面的<n ...