如何连续关闭两个模态视图控制器*动画*?

时间:2011-07-19 03:29:31

标签: ios animation uiviewcontroller

是的,我知道有完全相同的问题,但我想用双重动画来做这件事。 How to Dismiss 2 Modal View Controllers in Succession?

我的代码与上面的问题相同,

视图控制器A(在导航控制器中) - 模态视图控制器B - 模态视图控制器C

这里是伪代码

notification to B (as delegate)      // I changed order of this two lines, 
dismiss C *without* animation    // but it was same. 

(notification from C, in B)
dismiss B *with* animation

如果我在解雇C时使用动画,它不起作用,B将不会被解雇,因为解雇C的动画正在播放。

问题是:如果有动画播放,我无法启动另一个动画。

我可以连续播放动画吗?

这不仅是解除动画的问题,它还可以应用于其他iOS动画。

P.S:我想我可以使用计时器等到第一个动画结束,但它很脏而且不稳定,不是吗?

小谈:在我的节目中,

  • A:文章列表视图
  • B:写文章视图
  • C:登录视图(如果用户未登录)
今天,我要添加联接视图,我要及时解雇3个视图lol我该如何帮助呢?

7 个答案:

答案 0 :(得分:23)

iOS 5.0及更高版本:

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];

如果你有:

,这是有效的
A - starting view controller
M1 - modally presented by A
M2 - modally presented by M1

将这行代码放在M2的视图控制器类中(以及一个按钮或其他任何东西来激活它),它将通过层次结构“到达”并告诉A到dismissViewControllerAnimated:...

然而,Rahul Vyas的回答可能是一种更好的方法,适用于在“A”和最后一个Modal视图之间有未知数量的模态视图控制器的情况。

答案 1 :(得分:7)

您可以生成NSNotification,然后从第一个模态出现的根目录中关闭第一个模态视图控制器,所有其他模式将自动消失。我在我的一个应用程序中完成了这个。

答案 2 :(得分:0)

当您希望视图关闭模态视图时,可以使用[self dismissModalViewControllerAnimated:(BOOL)]。如果你在两个控制器中调用它,它应该工作。我自己没有尝试过,但似乎合乎逻辑。

我必须补充一点,如果你需要在一行中呈现多个模态视图,你应该考虑为其中一些使用不同的范例。例如,登录视图可以是警报视图而不是模态视图控制器。

答案 3 :(得分:0)

我遇到了类似的问题,试图让动画连续工作。我一直想尝试以下方法:

如果在调用performSelectorOnMainThread的内部调用第二个动画(即dimiss B),该怎么办?这会让我觉得第二个动画会被迫等待第一个动画完成。

我还没有测试过它。祝你好运 - 我对你提出的解决方案非常好奇。

答案 4 :(得分:0)

您可以使用

删除2个视图
[AviewController dismissModalViewControllerAnimated:YES];

这里AviewController是A的对象。 希望这会对你有所帮助。

答案 5 :(得分:0)

[self dismissModalViewControllerAnimated:(BOOL)]不起作用。第二个动画不会触发。在iOS 5中,您可以使用[self dismissViewControllerAnimated:YES completion:^{}];,但这不向后兼容4.0。我只是成功调用了一个委托方法,在呈现新模式之前关闭了模态视图控制器。

答案 6 :(得分:0)

以下是我的工作,我有A-> B,然后是容器视图" C"结束B.然后我想让C解雇回A,

对我有用的最佳方式是在视图C中调用此操作

self.presentingViewController?.dismiss(animated: true, completion: {})
self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: {})

这解雇了模态C,然后以同步顺序解散B.它的应用感觉更好用