setStatusBarHidden神奇地修复了不起作用的pushViewControllers,为什么?

时间:2018-07-19 17:45:43

标签: ios objective-c cocoa-touch

我需要在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];

这是一个糟糕的技巧,尤其是考虑到setStatusBarHidden:withAnimation:is deprecated since iOS 9

setStatusBarHidden:会导致viewControllers堆栈正确显示吗?

1 个答案:

答案 0 :(得分:0)

  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]; });

  2. 还可以:在视图控制器或导航控制器中使用:

    -(BOOL)statusBarHidden { 返回是; }