Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios setStatusBarHidden神奇地修复了无法工作的PushViewController,为什么?_Ios_Objective C_Cocoa Touch - Fatal编程技术网

Ios setStatusBarHidden神奇地修复了无法工作的PushViewController,为什么?

Ios setStatusBarHidden神奇地修复了无法工作的PushViewController,为什么?,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我需要在ViewController堆栈上推送两个视图控制器,下面是代码的简化版本: NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:navigationController.viewControllers]; [viewControllers addObject:vc1]; [viewControllers addObject:vc2]; [navigationController setViewContro

我需要在ViewController堆栈上推送两个视图控制器,下面是代码的简化版本:

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:navigationController.viewControllers];

[viewControllers addObject:vc1];
[viewControllers addObject:vc2];

[navigationController setViewControllers:viewControllers animated:YES];
它大部分时间都能工作,但在某些设备上有时不能。当它不工作时,代码实际上什么也不做(视觉上),屏幕上不会出现新的视图。逐步调试不会显示任何异常,视图已正确初始化,并确实添加到ViewController堆栈的顶部

将代码更改为使用
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:

setStatusBarHidden:
做了什么可能导致ViewController堆栈正确显示

你认为后遗症的影响是什么?

调度时间(调度时间(现在调度时间,(int64_t)(0.1*NSEC_/u秒))之后,调度获取主队列()^{ [[UIApplication sharedApplication]setStatusBarHidden:否 带动画:uistatusbaranimationne]; });

  • alse:在viewcontroller或navigationcontroller中使用:

    -(BOOL)状态栏隐藏 { 返回YES; }


  • 您是否可能从主/UI线程以外的线程调用它?而且。。。你的navigationController的堆栈上已经有视图控制器了吗?@DonMag感谢你花时间考虑这个问题!它位于主线程上(用[NSThread isMainThread]确认)。navigationController的堆栈上有一个viewController,即当前视图。感谢您的尝试,Liang Chen!我觉得这又是一次黑客攻击。我已经有了一个可行的方法,但我不明白为什么它能奏效。你能解释一下为什么你的解决方案会奏效吗?