从另一个模态视图控制器中关闭模态视图控制器

3

我正在从另一个模态视图控制器中展示一个模态视图控制器。当我解散第二个模态视图控制器时,第一和第二个模态视图控制器都应该被解散。我尝试访问第一个模态视图控制器,例如:

[self.view.superview dismissmodalviewcontroller];  

但是它显示错误。从第二个modalViewController获取ref的正确方法是什么,并从中调用dismiss方法?


已经问了25个问题后,我认为你应该学习如何在StackOverflow上正确地格式化。如果你格式化你的问题,使得它更容易阅读,人们更倾向于阅读和回答它。 - DarkDust
当您编写问题时,请使用鼠标选择整个代码部分,然后单击顶部的“{}”按钮。这是格式化代码的方法。 - Krishnabhadra
谢谢,我以后会记住的......顺便说一下,我还是卡住了。有人能帮忙吗? - sujith1406
6个回答

10

就像这样。

A 呈现了 B。在这里,A 是 B 的父控制器(在这里,A.modalViewController 将是 B,而 B.parentViewController 将是 A)

B 呈现了 C。在这里,B 是 C 的父控制器(在这里,B.modalViewController 将是 C,而 C.parentViewController 将是 B)

根据苹果的指南,父控制器有责任关闭其子控制器。

因此,如果您想关闭控制器 C,则需要在 C.parentViewController 上调用 dismissModalViewController。由于 C 的父控制器是 B,因此 B 正在关闭它呈现的模态(子)控制器。

但是您也想关闭 B。关闭 B 的责任在于 B 的父控制器。因此,您需要说 [B.parentViewController dismissModalViewControllerAnimated: YES];

因此,您需要从 C 中获取 B 作为 C.parentViewController(不要忘记在此处进行类型转换)。然后,您说 [B.parentViewController dismissModalViewControllerAnimated: YES];


2
尝试使用 [self.parentViewController dismissModalViewControllerAnimated:YES];,这将关闭两个模态视图控制器。

我尝试过这种方式。但似乎不起作用。这是视图层次结构。tableviewcontroller->modalviewcontroller->modalviewcontroller。 - sujith1406

2
为了进一步澄清,您可能需要的是这样的东西:
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

2
该方法 dismissModalViewControllerAnimated:UIViewController 类的一部分,而不是 UIView。因此您需要执行以下操作:
[self.parentViewController dismissModalViewControllerAnimated:YES];

不要在self.view.superview上调用它,而是使用以下方法:


这不起作用,尝试了这样做但只有一个视图被解除了。第一个模态视图没有去掉。还有其他方法可以实现吗? - sujith1406
@sujith1406:所以你应该已经有一个[self dismissModelViewControllerAnimated:YES];了。尝试用[self.parentViewController dismissModalViewControllerAnimated:YES];替换它。从链接的文档中可以看到:如果您连续呈现多个模态视图控制器,从而构建了一个模态视图控制器堆栈,则在堆栈较低的视图控制器上调用此方法会关闭其直接子视图控制器和所有在该子视图控制器上方的视图控制器。 - DarkDust
抱歉再次打扰您,当我收到您的答复后,我首先将 [self dismissModelViewControllerAnimated:YES]; 替换为 [self.parentViewController dismissModelViewControllerAnimated:YES]; 但在两种情况下只有第二个模态视图被解除。 - sujith1406

1

我刚才找到了答案,也许可以帮助其他人。 我们只需要一行代码。

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];

0

遗憾的是,视图总是会闪烁到堆栈中的第一个模态视图,然后执行动画。

我用自定义动画解决了这个问题:

        let transition: CATransition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionReveal
        transition.subtype = kCATransitionFromBottom
        self.view.window!.layer.add(transition, forKey: nil)
        self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接