在我的应用程序中,我提出了一个模态视图控制器,但我遇到了一些问题,我认为是由于我从子视图控制器呈现视图控制器这一事实。
对presentViewController: animated:
的调用来自位于导航控制器堆栈上的视图控制器,并且该导航控制器使用Interface Builder中的“容器视图”包含在另一个视图控制器中。此外部容器视图控制器在屏幕顶部有一个持久性横幅。
当显示视图控制器时,它会向上滚动动画,当它到达顶部时,它会进入容器视图控制器的横幅下方。但是,一旦动画结束,它再次出现在前面,但是在横幅所覆盖的模态视图控制器部分上不可能进行交互。从子视图控制器呈现模态视图控制器的正确方法是什么?
编辑:
我尝试直接访问容器视图控制器,它最初工作,但是一旦模态视图控制器被解除,容器视图就会以某种方式扩展以填满整个屏幕,重叠整个横幅。
编辑:
截图:
模态视图控制器向上滑动并出现在顶部的横幅下方,然后突然跳到前面。
答案 0 :(得分:3)
您需要将这两个方法放在AppDelegate中,并从您想要呈现的位置调用这些方法并解除modelviewconroller。
- (void)presentModelView{
[[[[self.window rootViewController] navigationController] topViewController] presentViewController:controller animated:YES];
}
- (void)dismissModelView{
[[[[self.window rootViewController] navigationController] topViewController] dismissViewControllerAnimated:YES completion:<#^(void)completion#>:controller animated:YES];
}
答案 1 :(得分:3)
我也遇到了这个问题:当从子视图控制器以模态方式调用视图控制器调用dismissViewControllerAnimated
时,子视图控制器也被解除。
在界面构建器中玩了一下之后,我设法解决了它。
只需将模态显示的视图控制器演示文稿样式更改为 Over Full Screen 。 (默认为全屏)
Swift
// In the viewController class you're presenting modally
self.modalPresentationStyle = .overFullScreen
答案 2 :(得分:0)
我猜你可以这样做:
[self.parentViewController presentViewController:controller animated:YES];
如果你需要从父母的父母那里展示它,你只需在self.parentViewController.parentViewController
上调用相同的方法
答案 3 :(得分:0)
您是否曾尝试从ChildViewController
对象中调用以下内容?
[self presentModalViewController:viewController animated:YES];
答案 4 :(得分:0)
正如问题评论中所讨论的那样,我尝试按照描述再现该问题,但不能。我认为问题是由于视图控制器的混乱呈现,在尝试呈现模态视图控制器时抛出系统。
答案 5 :(得分:-1)
您需要在横幅视图上方的视图控制器中显示视图控制器。最简单的解决方案是:
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:controller animated:YES];
警告:这应该适用于大多数情况,但是如果您模拟呈现的视图本身会以模态方式显示其他视图,则必须小心,在这种情况下,您将收到错误,因为此视图已经存在提出控制器。如果是这种情况,您可以通过迭代检查presentedViewController
属性来跟踪呈现的控制器链,直到找到一个nil
的控制器。