这是我的视图(控制器)层次结构:
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
答案 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获得了解决方案。