上一话讲完了小人脸Demo,我们也了解了MVC,那么这一话我们来把Demo复杂化,看看多个MVC之间是如何协同工作的。回顾一下我们之前讲过的多个MVC的情况。

IOS提供了一些控制器,它们的视图是其他MVC。这些控制器包括UITabBarController(选项卡控制器)、UISplitViewController(分栏控制器)、UINavigationController(导航栏控制器).

下面是一个选项卡控制器的示例:

用户点击屏幕下方的按钮选择不同的界面,下面按钮是UITabBarItem类型的,通常你在storyboard中设置它们。如果选项卡按钮多于5个,那么在尾部会以“。。。”来表示,点击可以看到多出来的按钮。

下面是分栏控制器的示例:

分为左右两个MVC。左侧为Master,右侧为Detail.。注意这个视图在iphone和ipad中显示不同,后面会看到。

下面是导航控制器的示例:

导航控制器不像刚才我们介绍的前两个,你可以明显看出多个MVC的排列方式,选项卡使用底部的按钮来指导用户切换MVC,而分栏控制器把两个MVC并排放置。在导航控制器中,我们把MVC看成卡片,那么控制器像放置一堆卡片这样放置MVC,你只能看到最上面的那个MVC,这就是导航控制器在多个MVC之间共享一个小的屏幕空间的方法。

需要注意的是由导航控制器参与绘图的是顶部的一块区域,导航控制器可以在这里设置标题,也可以放一些按钮,但是这部分的具体内容却是由最顶层的MVC决定的,每个顶部MVC通过它的UIViewController里面一个叫做navigationItem的属性来传递顶部的内容给负责控制它的导航控制器。所以我们经常看到随着顶部MVC的变化,页面顶部的内容也在不断变化。底下的部分是由顶部的MVC来绘制的。

点击顶部的General按钮,会把新的MVC放到顶部。

现在我就看不到其他的MVC了,导航控制器也可以在底部绘制几个新的按钮通过顶部MVC控制器中的toolbarItems属性,它由一些列的barItem属性构成。所以与顶部一样,底部的按钮也会随着当前最顶部MVC的不同而不同。

你可以看到最顶部的返回按钮,这个按钮的作用是移走当前最顶部的MVC,我将回到我之前的位置。当点击返回按钮的时候,顶部MVC的移除是完全移除,从堆栈中完全移除了。

我们继续点击

MVC堆中的MVC会越来越多,然后全部点击左上角的返回按钮,直到最后一个MVC,这时候左上角已经没有返回按钮了:

这三个控制器的作用都是展示多重MVC,现在来重点讨论一下导航控制器的工作原理:

顶部紫色的代表一个MVC,我们想在屏幕上增加些功能,但是空间不够了,或者从逻辑上来说我们要添加的东西不应该显示在这个MVC上。所以我们应该创建另外一个MVC来管理那些不属于这个MVC的功能。

所以我应该找到一种方法让这两个MVC能共享一个屏幕控件,我能使用一个分栏控制器或者如果这两者之间是平等关系的话我们可以使用选项卡控制器。当然我们可以使用导航控制器。

导航控制器本身也是一个MVC,一个MVC的控制器,但是它是一个特殊的MVC,它有一个叫做rootViewController的outlet,这个outlet指向某个MVC,确切的说是指向某个MVC的控制器。当这个outlet指向某个MVC的控制器时,就会向那个MVC的视图绘制出来,也就是view属性,我们已经知道控制器的view属性也就是其控制的所有属性的根视图。如下图:

导航控制器把这个view放置到屏幕上,标题栏之下。因为它会布满整个矩形空间,所以标题栏会变成半透明以显示标题栏下面的那部分内容。那么我们如何让其他MVC与我们的导航控制器联系起来呢。当某个在这个视图中的UI元素,例如一个按钮或者其他东西被按下的时候,这可能导致其他的MVC被创建,当我们做这些变换的时候,我们始终会创建新的MVC.

然后导航控制器就会移到新建的MVC上。

然后新的MVC的左上角会有一个返回按钮。

当我们点击这个按钮的时候会返回到第一个MVC中,注意这个时候刚才的MVC已经彻底消失了!它不是被隐藏了,它从内存空间中被deallocated了。

这就是导航控制器的工作原理,分栏控制器和选项卡控制器也是类似的。

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记20 Multiple MVCs 多MVC模式、NavigationController导航控制器...相关推荐

  1. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记32 NSNotification

    我们之前在讲解MVC模式的时候提到过,模型的改变是通过广播的形式,然后控制器将调到响应的频率接收到模型的消息,找出模型中的变化,这些变化其中之一就是NSNotification,它是MVC中处理电台的 ...

  2. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记24 popovers弹窗

    上几话中我们详细了解了几种segue,我们也了解到了多MVC模式的几种控制器,比如导航.选项卡和分栏,除了这三种多MVC的模式之外,还有一种popover,它跟其他三种不太一样.首先先来认识一下pop ...

  3. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记23 多MVC模式Demo的实现

    上一话我们对Demo的选择界面做了自动布局的相关处理,现在开始连接多个MVC的操作.首先我们需要其他工程中的文件,那么让我们打开另一个app.点击下面这个文件 然后拖动我们需要的文件到新的工程目录下: ...

  4. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记30 ScrollView Demo实战

    在上一话中我们创建了一个通过URL读取图片的Demo,这个Demo是不能拖动和缩放的,现在给它增加选项让它可以手动切换URL,并把图片添加到ScrollView中. 向Storyboard中拖入一个s ...

  5. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记39 AlertActionSheet

    Alert和ActionSheet是IOS中弹出消息的两个工具. 首先它们都是Modal的方式展示的. Alert用来向用户发起询问,可以有一个(比如取消)或两个选项(比如确定和取消),也可以附带一个 ...

  6. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记15 storyboard中的绘图 MVC模式

    上一话中我们实现了对一个小人表情的绘制,但是我们需要修改代码才能实现表情的变换,而且我们也没有一个明确地模型,这很明显不符合MVC的要求,这一话中我们将要修改它已符合MVC的要求. 在上一话中我们已经 ...

  7. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记47 文件系统Demo

    本话将展示如何使用文件系统保存相机中保存的封面照片,使用一个提前准备好的封面设置Demo,在设置完imageView的image时候把新的图片保存到文件系统中. func imagePickerCon ...

  8. 斯坦福机器学习公开课学习笔记(1)—机器学习的动机与应用

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景         斯坦福机器学习公开课差不多是网上能找到的最好的机器学习入门课程了.现在一共有20节课放 ...

  9. 斯坦福iOS7公开课4-6笔记及演示Demo

    1.变量类型别滥用id,如果不仔细容易在程序执行时引发错误,因为在编译阶段编译器只是检测变量对象所属类型,尤其是类型为id时代表任何类型都可以通过检查,但不会检测变量对象调用的方法,这样当对象所属类不 ...

最新文章

  1. 发布 | 2018年中美智慧城市行业研究系列报告
  2. 【手记】解决启动SQL Server Management Studio 17时报Cannot find one or more components...的问题
  3. 遍历二叉树的各种操作(非递归遍历)
  4. javascript动画函数封装(升级版)
  5. 关于汉诺塔非递归算法的一点思考
  6. iphone11系统输入框的光标位置不正常
  7. IBM 火雪挺:人工智能如何影响衣食住行?
  8. Android WebView 开发详解(二)
  9. 两台计算机怎样共享一台打印机共享文件夹,两台电脑怎么共享文件和打印机
  10. 天津大学计算机专硕_「20考研」计算机考研专业课变动汇总
  11. 如何使用UMAP分析100维数据,惊艳令人叹为观止
  12. 微软部分专卖店地址选定 今秋开张
  13. SpringSecurity的注解实现方式:@Secured,@PreAuthorize,@PostAuthorize
  14. Rust REPL Jupyter notebook
  15. Kali linux配置
  16. matlab和ansys联合优化,MATLAB与HFSS联合建模与仿真优化详细介绍
  17. 浅谈OCR之Onenote 2010
  18. C#把文字放到图片上
  19. eclipse 创建maven项目 出现Could not calculate build plan错误解决
  20. 手风琴页面html,滑动手风琴的制作(只涉及HTML+css)

热门文章

  1. mysql insert 数据_MySQL-插入数据(INSERT)
  2. mysql python安装错误_mysql-python安装致命错误
  3. Mysql增强半同步模式_MySQL增强半同步参数rpl_semi_sync_master_wait_point值AFTER_SYNC和AFTER_COMMIT...
  4. python numpy 数据类型为python对象-python numPy模块 与numpy里的数据类型、数据类型对象dtype...
  5. 零基础 8 周掌握 Python,成为全能人才!
  6. 双宋喜结连理过程可以通过python爬虫Aispider 几行代码就能搞定!
  7. rockmq运维指令_RocketMQ运维监控
  8. 电脑字体在哪个文件夹_电脑键盘使用方法
  9. 详解Printjack打印机攻击
  10. 信号量Semaphore一篇文章叫你明白