DarkAngel7 / UINavigationController-DAPowerfulCustomization

A category to expand UINavigationController, UINavigationItem and UIViewController. You can customization UINavigationBar for each view controller and enjoy your life.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

和MBProgressHUD一起使用时会崩溃

sunq08 opened this issue · comments

和MBProgressHUD一起使用时一运行直接就崩了

经过测试iOS 9、10、11,我使用最新版本的MBProgressHUD,并没有出现崩溃问题。
建议你更新下最新版本的UINavigationController+DAPowerfulCustomization
你也可以排查下Crash时的stack,是否跟你的项目某些页面设置有关。

我试了一下,把hud放到keyWindow上就崩了,放到当前视图的view上就好了,总之多谢了

我看了下,在此说明下:
1、UINavigationBar是公用的,想实现每个viewController可以定制不同的appearance,就必须在适当的地方获取vc.navigationItem的所有值,然后根据这些值进行UINavigationBar的调整。
2、UINavigationItem的属性有可能是在init中设置的,也有可能是在viewDidLoad中设置的,那么UINavigationController就必须先调用[vc setNeedsLayout]确保vc的viewDidLoad已经调用,从而获取正确的navigationItem的所有属性。
3、在viewDidLoad之后的方法(如viewWillAppear等)中设置的navigationItem的属性,在set方法中,navigationItem已经是topItem,代码中也已经做过处理。
4、在UINavigationControllerviewDidLoad中调用[self.topViewController setNeedsLayout]时可能会触发topViewController的viewDidLoad。如果此时你在topViewController的viewDidLoad中把MBProgressHUD添加到keyWindow上,并且当前的UINavigationController正好是keyWindowrootViewController,由于此时[UIApplication sharedApplication].keyWindownilMBProgressHUDinitWithView:方法会主动抛出异常,so 崩溃了。

解决方案:
以目前的设计来看,很难回避这个问题,毕竟keyWindow是在UINavigationController之前创建的还是之后无从得知。如果你依然想使用keyWindow作为MBProgressHUDsuperview,那在viewDidLoad中,添加一点点延迟,如:

dispatch_async(dispatch_get_main_queue(), ^{
      MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].keyWindow animated:YES];
      hud.....
});

受教了,多谢!