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的更多相关文章

  1. 【IOS笔记】View Controller Basics

    View Controller Basics   视图控制器基础 Apps running on iOS–based devices have a limited amount of screen s ...

  2. View Controller Programming Guide for iOS---(四)---Creating Custom Content View Controllers

    Creating Custom Content View Controllers 创建自定义内容视图控制器 Custom content view controllers are the heart ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)

    这个问题是什么意思呢,之前遇到过几次,但程序再次打开时没有问题,也就没有重视,今天又遇到了,无法忍受啊. 控制台报的错误是:"不支持多次推入相同的视图控制器实例". 什么原因造成的 ...

  7. 报错: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 ...

  8. iOS架构师之路:控制器(View Controller)瘦身设计

    前言 古老的MVC架构是容易被iOS开发者理解和接受的设计模式,但是由于iOS开发的项目功能越来越负责庞大,项目代码也随之不断壮大,MVC的模糊定义导致我们的业务开发工程师很容易把大量的代码写到视图控 ...

  9. Model View Controller

    On the iPhone or iPod touch, a modal view controller takes over the entire screen. This is the defau ...

随机推荐

  1. 【转载】RMAN备份保留策略设置相关命令

    转自 http://blog.sina.com.cn/s/blog_7c5a82970101g4s7.html 策略有两种,一种是基于恢复窗口策略的,一种是基于冗余策略的. 基于恢复窗口策略: 定义的 ...

  2. jQuery中的Ajax几种请求方法

    在网上查的几种Ajax的请求的方法: jQuery 确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯.废话少说,直接进入正题,我 ...

  3. 个人制作-css+html旋转立方体的制作

    源代码: <!DOCTYPE html><html><head>    <title></title>    <meta charse ...

  4. 我是如何在我的unbuntu 虚拟机上安装 配置QT的

    ①使用 linux公社 上面的脚本下载 qt5.5离线版 在上一篇随笔中 ②配置环境变量使bash能早到qmake编译器 # sudo vi  /etc/profile (打开 全局环境变量保存位置) ...

  5. CodeForces 239A. Triangle

    Link:  http://codeforces.com/contest/407/problem/A 给定直角三角形的2个直角边a,b.求在直角坐标系中,是否存在对应的直角三角形,使得三个定点都在整点 ...

  6. HTML5 3D爱心动画 晚来的七夕礼物

    在线演示源码下载 这么好看的HTML5爱心动画,我们当然要把源代码分享给大家,下面是小编整理的源代码,主要是HTML代码和CSS代码. HTML代码: <div class=’heart3d’& ...

  7. Java学习

    第一个java程序: 用记事本创建一个文件名为HelloWorld.java文件,我的目录为D:\My Documents\Java-workspace\Test\HelloWorld.java. 打 ...

  8. GetLastError返回值的含义

    [0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [6]-句柄无效. [7]-存储控制块被损坏 ...

  9. Android中使用AlarmManager进程被删除的解决办法

    http://blog.csdn.net/zhouzhiwengang/article/details/13022325 在Android中,AlarmManager提供了不受休眠状态的系统定时功能, ...

  10. chosen组件实现下拉框

    chosen组件用于增强原生的select控件,使之有更好的用户体验.官方demo https://harvesthq.github.io/chosen/ 目前项目中碰到的使用,比如一个页面中有两个不 ...