首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

施用MBProgressHUD引发"self.navigationController.view为nil"的血案

2012-08-29 
使用MBProgressHUD引发self.navigationController.view为nil的血案首先介绍下开源的第三方库MBProgressH

使用MBProgressHUD引发"self.navigationController.view为nil"的血案

首先介绍下开源的第三方库MBProgressHUD

一个很好的实现了加载提示框的第三方demo。广泛用于应用中。

简单看下界面

施用MBProgressHUD引发"self.navigationController.view为nil"的血案

开源地址:https://github.com/jdg/MBProgressHUD


好了,本文不是介绍如何使用它。

主要说下 我在使用这斯货时遇到一个怪异问题,然后引发出的一点自我解释,或许你也会遇到的一个问题。


我们先来看下demo给的一个简单例子


因此我会需要frame大小理论上是self.navigationController.view大小。

于是就很顺手的传递进将其传递进去。

但是,当我从前一个界面跳转到这个界面,进行第一次加载时,会报错"View must not be nil."

什么情况!!

demo 翻来翻去,他就是这么写的啊。

然后再看一下我的流程,

在viewDidLoad中所有都初始化加载完后,调用了网络请求,然后去实例化hud。

然后我又去degub下了,发现self.navigationController居然是空的~~

就是说此刻我这个视图控制器还没有拥有对导航控制器的引用~


突然就觉得好奇怪,那我等会会用到self.navigationController push到下一个控制器,又说明它是存在的了。

因此简单猜想下整个流程机制问题:

1.我从前一个视图推push当前视图时,先实例化然后加载该控制器的所有UI界面,将这整体放入视图控制器栈中(理论上也就是成了栈顶视图控制器)。

2.导航栏控制器将这个top视图添加到window上,把自身指针传给这个top视图,使其获得导航引用以及控制权。

简单来说,viewdidload只是加载初始化了所有视图。然后添加到导航控制视图栈中,然后将其当做顶端视图控制器添加到window上

(猜测,但是大致意思应该就是这样),赋予navigationController的引用控制权。因此此刻才self.navxxxx被赋值了。

然后根据控制器的生命周期,因为我们知道,把视图的显示就是一个控制器将视图添加到window上的过程和结果。

在这一步中,视图控制器会调用viewWillAppear,以及didapp~~。

然后我重载测试后,此刻nav已经被赋值。

这也就是说,此刻你调用网络请求,hud实例化时nav不会再被报空。


说了这么多,其实真正的意思只是对导航控制的工作原理做一个自我的感性认识。

因为貌似在此之前,我还真么仔细去理解控制器,视图栈是如何运作的,而是机械性的看了simpleCode,

就说,哦,我知道这个控件啊,不就这么用么。

同样希望对一些碰到和我同样的异常的朋友有所帮助。

以上可能只是我自己对自己的一个解释,更多真实内容请参考官方文档。



热点排行