关闭模态视图控制器会导致黑屏

时间:2014-10-29 22:48:59

标签: ios objective-c iphone xcode modalviewcontroller

这是我的视图(控制器)层次结构:

  • UITabBarController(作为应用的rootViewController
  • UINavigationController(作为其中一个viewController标签的tabBar
  • UIViewController(作为rootViewController的{​​{1}})
  • UINavigationController(作为子视图)
  • UICollectionView(作为MyViewController.view
  • 的部分标题视图

所以,我需要从UICollectionView呈现一个模态视图控制器。我试过用

做了
MyViewController

虽然它有效,但是Xcode警告我"不鼓励在分离的视图控制器上呈现视图控制器",这是正确的,因为modalVC只填充集合视图头的视图,它不是满的我之后的屏幕。

我尝试过的所有其他选项:

[self presentViewController:modalVC animated:YES completion:nil];

根据需要显示modalVC全屏​​,但是,当我通过调用

关闭modalVC时
UITabBarController *tb = (UITabBarController *)self.view.window.rootViewController;
[tb presentViewController:modalVC animated:YES completion:nil];

or...

UINavigationController *nc = (UINavigationController *)tb.selectedViewController;
[tb presentViewController:modalVC animated:YES completion:nil];

or...

UICustomViewController *cv = (UICustomViewController *)nc.topViewController;
[vc presentViewController:modalVC animated:YES completion:nil];

从modalVC本身,modalVC确实解散了自己,但我留下了黑屏。稍微调试后发现,在解雇modalVC后,[self dismissViewControllerAnimated:YES completion:nil]; 变为self.view.window.rootViewController

知道为什么会这样,以及如何解决这个问题?

修改

这是一款iPhone应用程序。 iOS7和iOS8都有黑屏。另外,下面是我发起nil

的方法
MyViewController

4 个答案:

答案 0 :(得分:7)

我发现解决方案 - this answer确实有帮助。诀窍是解雇视图控制器。它应该这样做:

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

而不是这样:

[self dismissViewControllerAnimated:YES completion:nil];

虽然链接答案的作者建议使用委托更好的方法(presentED VC会定义一个协议并且呈现VC会订阅它然后在它要求时解除现有的VC),它不是&# 39;在我的情况下是可行的。

答案 1 :(得分:2)

这是一款iPad应用吗?如果是,请添加

modalVC.modalPresentationStyle = UIModalPresentationFullScreen

之前

[self presentViewController:modalVC animated:YES completion:nil];
MyViewController中的

可能会成功。

答案 2 :(得分:0)

我在Apple的UIViewController文件中找到了一些信息

  

//接下来的两个方法是presentModalViewController的替换:animated和     // dismissModalViewControllerAnimated:在提供的控制器viewDidAppear:callback被调用后,将调用完成处理程序(如果提供)。

     
      
  • (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void(^)(void))completion NS_AVAILABLE_IOS(5_0);   //完成处理程序(如果提供)将在被解除的控制器的viewDidDisappear:调用回调之后被调用。
  •   
  • (void)dismissViewControllerAnimated:(BOOL)标志完成:(void(^)(void))完成NS_AVAILABLE_IOS(5_0);
  •   

在描述时,您直接将UIViewController中的视图添加到另一个视图中。所以不调用viewDidAppear和viewDidDisappear。我猜你最好手动执行这两种方法。

答案 3 :(得分:0)

在显示带有presentViewController:的屏幕并用dismissViewControllerAnimated:将其关闭后,我遇到了黑屏问题。我的问题是dismiss命令正在卸载整个视图结构。我的问题已解决,将modalPresentationStyle设置为UIModalPresentationOverFullScreen,如下:

viewController.modalPresentationStyle = UIModalPresentationOverFullScreen;
[self presentViewController:viewController animated:YES completion:nil];

我从here获得了解决方案。