【发布时间】: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 就是当前视图。
标签: ios objective-c cocoa-touch