setStatusBarHidden 神奇地修复了无法正常工作的 pushViewController,为啥?
Posted
技术标签:
【中文标题】setStatusBarHidden 神奇地修复了无法正常工作的 pushViewController,为啥?【英文标题】:setStatusBarHidden magically fixes not working pushViewControllers, why?setStatusBarHidden 神奇地修复了无法正常工作的 pushViewController,为什么? 【发布时间】:2018-07-19 17:45:42 【问题描述】:我需要在 viewControllers 堆栈上推送两个视图控制器,这是代码的简化版本:
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:navigationController.viewControllers];
[viewControllers addObject:vc1];
[viewControllers addObject:vc2];
[navigationController setViewControllers:viewControllers animated:YES];
它在大多数情况下都有效,但在某些设备上有时无效。当它不起作用时,代码实际上什么都不做(视觉上),屏幕上不会出现新视图。逐步调试没有发现任何异常,视图已正确初始化,并且确实添加到了 viewControllers 堆栈的顶部。
将代码更改为使用pushViewController
两次而不是setViewControllers
并没有修复它。但是,我发现最奇怪的修复方法非常有效:
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[viewControllers addObject:vc1];
[viewControllers addObject:vc2];
[self.navigationController setViewControllers:viewControllers animated:YES];
// The following two lines fix the issue
[[UIApplication sharedApplication] setStatusBarHidden:YES
withAnimation:UIStatusBarAnimationNone];
[[UIApplication sharedApplication] setStatusBarHidden:NO
withAnimation:UIStatusBarAnimationNone];
这是一个糟糕的 hack,尤其是考虑到 setStatusBarHidden:withAnimation:is deprecated since ios 9。
setStatusBarHidden:
做了什么可能导致 viewControllers 堆栈正确显示?
【问题讨论】:
您是否可能从主/ UI 线程以外的线程调用它?而且...您的 navigationController 已经在它的堆栈上有视图控制器了吗? @DonMag 感谢您花时间考虑!它在主线程上(通过 [NSThread isMainThread] 确认)。而且 navigationController 在它的栈上有一个 viewController 就是当前视图。 【参考方案1】:你考虑后遗症吗?
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; );
另外:在 viewcontroller 或 navigationcontroller 中使用:
-(BOOL)statusBarHidden 返回是;
【讨论】:
感谢梁晨的尝试!这对我来说似乎是另一个黑客。我已经有一个可以工作的 hack,但我不明白 为什么 它可以工作。你能解释一下为什么你的解决方案会奏效吗?以上是关于setStatusBarHidden 神奇地修复了无法正常工作的 pushViewController,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
根据 iOS 版本调用适当的 setStatusBarHidden
Docsify v4.12.0 发布,神奇的文档网站生成工具
MFMailComposeViewController 操作表在 iOS5 上 setStatusBarHidden:YES 时不在屏幕上