从子视图控制器呈现模态视图控制器

时间:2013-11-27 20:23:58

标签: ios iphone objective-c uiviewcontroller

在我的应用程序中,我提出了一个模态视图控制器,但我遇到了一些问题,我认为是由于我从子视图控制器呈现视图控制器这一事实。

presentViewController: animated:的调用来自位于导航控制器堆栈上的视图控制器,并且该导航控制器使用Interface Builder中的“容器视图”包含在另一个视图控制器中。此外部容器视图控制器在屏幕顶部有一个持久性横幅。

当显示视图控制器时,它会向上滚动动画,当它到达顶部时,它会进入容器视图控制器的横幅下方。但是,一旦动画结束,它再次出现在前面,但是在横幅所覆盖的模态视图控制器部分上不可能进行交互。从子视图控制器呈现模态视图控制器的正确方法是什么?

编辑:

我尝试直接访问容器视图控制器,它最初工作,但是一旦模态视图控制器被解除,容器视图就会以某种方式扩展以填满整个屏幕,重叠整个横幅。

编辑:

截图:

模态视图控制器向上滑动并出现在顶部的横幅下方,然后突然跳到前面。

6 个答案:

答案 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

enter image description here

答案 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的控制器。