我正在从另一个模态视图控制器中展示一个模态视图控制器。当我解散第二个模态视图控制器时,第一和第二个模态视图控制器都应该被解散。我尝试访问第一个模态视图控制器,例如:
[self.view.superview dismissmodalviewcontroller];
但是它显示错误。从第二个modalViewController获取ref的正确方法是什么,并从中调用dismiss方法?
我正在从另一个模态视图控制器中展示一个模态视图控制器。当我解散第二个模态视图控制器时,第一和第二个模态视图控制器都应该被解散。我尝试访问第一个模态视图控制器,例如:
[self.view.superview dismissmodalviewcontroller];
但是它显示错误。从第二个modalViewController获取ref的正确方法是什么,并从中调用dismiss方法?
就像这样。
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];
[self.parentViewController dismissModalViewControllerAnimated:YES];
,这将关闭两个模态视图控制器。[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
UIViewController
类的一部分,而不是 UIView
。因此您需要执行以下操作:[self.parentViewController dismissModalViewControllerAnimated:YES];
不要在self.view.superview
上调用它,而是使用以下方法:
[self dismissModelViewControllerAnimated:YES];
了。尝试用[self.parentViewController dismissModalViewControllerAnimated:YES];
替换它。从链接的文档中可以看到:如果您连续呈现多个模态视图控制器,从而构建了一个模态视图控制器堆栈,则在堆栈较低的视图控制器上调用此方法会关闭其直接子视图控制器和所有在该子视图控制器上方的视图控制器。 - DarkDust我刚才找到了答案,也许可以帮助其他人。 我们只需要一行代码。
[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];
遗憾的是,视图总是会闪烁到堆栈中的第一个模态视图,然后执行动画。
我用自定义动画解决了这个问题:
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)