Controller <-> View 一般视图层级
关于 self.navigationController.view
相信看过 MBProgressHUD 官方例子 HudDemo
代码的同学应该看到过下述代码:
1 |
|
当时,你可能会对 self.navigationController.view
有些疑惑,这是什么玩意?其实,如果我们查看下 UINavigationController.h
文件就会发现,UINavigationController
其实是继承自 UIViewController
的,那么它拥有 view
属性也就不奇怪了。
1 |
|
下面,我们会结合 Reveal 清楚地看到 self.navigationController.view
到底是什么东西,稍安勿躁。
显示 MBProgressHUD
初始化 MBProgressHUD 时需要我们传入一个 UIView
类型的参数 view
,而显示 MBProgressHUD 的原理其实就是用 addSubview
方法将 MBProgressHUD 添加为这个 view
的子视图。
我们先来看看未显示 MBProgressHUD 时,应用的视图层次结构。其中 1 为 UIWindow
,即 self.view.window
,2 是 UINavigationController
的 view
,即我们前面提到的 self.navigationController.view
,3 为 self.view
,4 为导航栏 UINavigationBar
,即 self.navigationController.navigationBar
。
通过这张图,我们清楚地看到了 self.view.window
、self.navigationController.view
、self.view
和 self.navigationController.navigationBar
在应用的视图层次中所处的位置,以及它们之间的层次关系。
下面,我们就对比一下 MBProgressHUD 分别在 self.view.window
、self.navigationController.view
和 self.view
上显示时应用的视图层次结构,以及导航栏上按钮的可用情况。
方式 1 - On self.view.window
使用这种方式时,MBProgressHUD 被添加到了 self.view.window
上,它与 self.navigationController.view
在视图层次上是平级的,同为 self.view.window
的子视图。但是由于 MBProgressHUD 是后添加的,所以它处于 self.navigationController.view
的上方,因此导航栏上的按钮均不可点击。
方式 2 - On self.navigationController.view
使用这种方式时,MBProgressHUD 被添加到了 self.navigationController.view
上,它与 self.navigationController.navigationBar
在视图层次上是平级的,同为 self.navigationController.view
的子视图。但是由于 MBProgressHUD 是后添加的,所以它处于 self.navigationController.navigationBar
的上方,因此导航栏上的按钮也均不可点击。
方式 3 - On self.view
使用这种方式时,MBProgressHUD 被添加到了 self.view
上,不管 self.view
或 MBProgressHUD 是否占满整个屏幕,self.navigationController.navigationBar
永远处于 MBProgressHUD 的上方。因此,导航栏上的按钮一直是可点击的。
总结
当你需要让导航栏上的按钮不可点击的时候,可以选择使用 方式 1
或 方式 2
显示 MBProgressHUD 。反之,可以选择 方式 3
。
参考链接:
1.http://blog.leichunfeng.com/blog/2015/03/16/talking-about-the-usage-of-mbprogresshud-combined-with-reveal/
Controller <-> View 一般视图层级的更多相关文章
- django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统
Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...
- iOS Programming View Controllers 视图控制器
iOS Programming View Controllers 视图控制器 1.1 A view controller is an instance of a subclass of UIVi ...
- 移花接木:借助 IViewLocationExpander 更换 ASP.NET Core View Component 视图路径
端午节在家将一个 asp.net 项目向 asp.net core 迁移时遇到了一个问题,用 view component 取代 Html.RenderAction 之后,运行时 view compo ...
- 浏览器视图层级中的“根”:<html>和<body>的属性研究
做前端开发的同学都会知道,每一个UI系统(比如IOS或Android)中都会有一个view hierarchy(视图层级)的概念,即所有的可视元素(大到一个页面,小到一个button)都在一个树形结构 ...
- Reactjs的Controller View模式
摘要:做一个可以利用props来控制和传递所有状态给其子组件的顶级组件是一件非常酷的事情 不要和“MVC”混淆了,只有能够控制和传递所有的“state”的顶层组件,我们才叫它"view co ...
- Backbone.js学习之Backbone.View(视图)
Backbone.js为复杂WEB应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视 ...
- ASP.NET MVC中将数据从Controller传递到视图
ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...
- Django的View(视图)
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- 【view】 视图组件说明
view 是视图容器,可用于包裹其它组件或文本内容. 原型: <view hover-class="[String]" hover-stop-propagation=&quo ...
随机推荐
- php 问答
1,如何设置长生命期的session ? 将 session.cookie_lifetime ,session.gc_maxlifetime 的时间设置长一点. 2,为什么初始化session的时候报 ...
- php和node高并发 大数据量怎么处理
有的时候可能因为疏忽忘记注册Service直接就使用了,使用那个Service时会报异常.这种情况项目都是可以编译通过的,是一个不太容易发现的BUG,如果那个Service在测试时没有覆盖到这个BUG ...
- centos6 + tomcat+ jdk配置步骤
1. 获取tomcat, jdk安装文件 mkdir /media/smbdirmount -o username=pas,password=111111 //109.110.100.50/pas / ...
- 在eclipse中maven web项目部署到tomcat,访问不了
修改eclipse中tomcat发布路径后,能正常访问
- curl 命令使用总结
curl 查看网页源码 curl www.sina.com 保存页面 -o curl -o [文件名] www.sina.com 直接在curl命令后加上网址,就可以看到网页源码. 如果要把这个网页保 ...
- xfs文件系统磁盘配额
引言 这篇文章简单介绍一下xfs文件系统的磁盘配额配置. 文章目录 0×1.开启分区磁盘配额 0×2.使用xfs_quota命令配置磁盘配额 0×1.开启分区磁盘配额 对于ext4文件以前的文件系统, ...
- PHP面向对象编程 对象的基本概念 PHP面向对象的基本实践 PHP面向对象的高级实践 PHP面向对象的特殊实践
再次梳理一下面向对象编程的要点. 此文是以php为例,但思想是通用的. 总结的PHP面向对象编程笔记 对象的基本概念 对象的基本构成 对象包含两部分 一.对象的组成元素 是对象的数据模型,用于描述对象 ...
- CSS 选择器之基本选择器 属性选择器 伪类选择器
CSS 选择器 常见的选择器列表图 CSS选择器笔记 基本选择器 通配符选择器(*) 元素选择器(E) 类选择器(.className) 所有浏览器都支持类选择器,但多类选择器(.classNa ...
- 安卓Activity、service是否处于同一进程
Activity与Service是否处于同一进程? 1)默认情况下(不写android:process的时候),此时同一个应用程序的所有组建位于同一进程里,Activity与service也处于同 ...
- 小程序--改变子级别页面导航栏信息 / navigationBarTitleText
微信小程序在公共文件app.json中设置了导航栏相关样式如下: 其中 navigationBarTitleText 为设置导航栏名称,若是想子级页面和父页面的header页面不同,则在子级文件中新 ...