和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、在UINavigationController
的viewDidLoad
中调用[self.topViewController setNeedsLayout]
时可能会触发topViewController的viewDidLoad
。如果此时你在topViewController的viewDidLoad
中把MBProgressHUD
添加到keyWindow
上,并且当前的UINavigationController
正好是keyWindow
的rootViewController
,由于此时[UIApplication sharedApplication].keyWindow
是nil
,MBProgressHUD
的initWithView:
方法会主动抛出异常,so 崩溃了。
解决方案:
以目前的设计来看,很难回避这个问题,毕竟keyWindow
是在UINavigationController
之前创建的还是之后无从得知。如果你依然想使用keyWindow
作为MBProgressHUD
的superview
,那在viewDidLoad
中,添加一点点延迟,如:
dispatch_async(dispatch_get_main_queue(), ^{
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].keyWindow animated:YES];
hud.....
});
受教了,多谢!