关于 self.navigationController.view

相信看过 MBProgressHUD 官方例子 HudDemo 代码的同学应该看到过下述代码:

1
HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];

当时,你可能会对 self.navigationController.view 有些疑惑,这是什么玩意?其实,如果我们查看下 UINavigationController.h 文件就会发现,UINavigationController 其实是继承自 UIViewController 的,那么它拥有 view 属性也就不奇怪了。

1
NS_CLASS_AVAILABLE_IOS(2_0) @interface UINavigationController : UIViewController

下面,我们会结合 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 一般视图层级的更多相关文章

  1. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

    Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

  2. iOS Programming View Controllers 视图控制器

    iOS Programming View Controllers  视图控制器  1.1  A view controller is an instance of a subclass of UIVi ...

  3. 移花接木:借助 IViewLocationExpander 更换 ASP.NET Core View Component 视图路径

    端午节在家将一个 asp.net 项目向 asp.net core 迁移时遇到了一个问题,用 view component 取代 Html.RenderAction 之后,运行时 view compo ...

  4. 浏览器视图层级中的“根”:<html>和<body>的属性研究

    做前端开发的同学都会知道,每一个UI系统(比如IOS或Android)中都会有一个view hierarchy(视图层级)的概念,即所有的可视元素(大到一个页面,小到一个button)都在一个树形结构 ...

  5. Reactjs的Controller View模式

    摘要:做一个可以利用props来控制和传递所有状态给其子组件的顶级组件是一件非常酷的事情 不要和“MVC”混淆了,只有能够控制和传递所有的“state”的顶层组件,我们才叫它"view co ...

  6. Backbone.js学习之Backbone.View(视图)

    Backbone.js为复杂WEB应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视 ...

  7. ASP.NET MVC中将数据从Controller传递到视图

    ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...

  8. Django的View(视图)

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  9. 【view】 视图组件说明

    view 是视图容器,可用于包裹其它组件或文本内容. 原型: <view hover-class="[String]" hover-stop-propagation=&quo ...

随机推荐

  1. 每天点滴的进行,css+div简单布局...布局

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. LeetCode 328. Odd Even Linked List C#

    Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...

  3. 线性规划?数学?差分约束?Good Bye 2016 C

    http://codeforces.com/contest/750/problem/C 反正我不会这道题...为什么那么多人做出来了...我好菜.jpg 题目大意:cf每个人都有分数,每次都会在div ...

  4. 一种基于FSIM对视频编码图像质量客观评价的方法

    一 为什么对视频编码图像质量客观评价     视频图像质量主观评价一般采用连续双激励质量度量法对任一观测者连续给出原始视频图像和处理过的失真图像,由观测者根据主观感知给出分值,其需针对多个视频对象进行 ...

  5. uitabbarController tababr 上方横线隐藏

    在自定义的tabbarController里加上这一句就ok [[UITabBar appearance] setShadowImage:[UIImage new]]; [[UITabBar appe ...

  6. 兼容 console 没删除引起 低级浏览器 报错问题

    /*重写connsole.log,防止调试代码出错*/if (!window.console){ var names = ["log", "debug", &q ...

  7. C# 从零开始 vol.2

    这是第二篇 1:命名空间 命名空间可以理解成类的文件夹,这个命名空间中存放着各种类,当你需要使用到对应的类的时候,就需要导入命名空间后才能使用. 引用:可以理解成添加新的存放类的文件夹,也就是一个项目 ...

  8. JQuery $ $.extend(),$.fn和$.fn.extend javaScript对象、DOM对象和jQuery对象及转换 工具方法(utility)

    一.为什么jquery前面要写$ Javascript没有package的概念,而作者又希望所有jQuery相关的API都能通过一个全局性的对象来容纳. 名为jQuery的全局变量就是这样一个对象,不 ...

  9. jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)

    在asp.net webForm开发中,用Jquery ajax调用aspx页面的方法常用的有两种:下面我来简单介绍一下. [WebMethod] public static string SayHe ...

  10. python升级2.7.5

    一开始有这个需求,是因为用 YaH3C 替代 iNode 进行校园网认证时,一直编译错误,提示找不到 Python 的某个模块,百度了一下,此模块是在 Python2.7 以上才有的,但是系统的自带的 ...