一次性关闭多个视图控制器时出现奇怪行为

3

这是一个常见的问题,对于所有还不知道如何正确处理这个问题的人,以下是解决方案。

模态呈现的视图控制器 A -> B -> C。

现在您想用一种平滑的动画将视图控制器 C 与 B 一起关闭,并回到视图控制器 A。因此,苹果文档指出,您只需要执行以下操作:

[A dismissViewConttollerAnimated:YES completion:nil];

enter image description here


展示你的演示代码。 - Wain
控制器 B 应该被解散而不是 A,因为您想降落在 A 上。理想情况下,应该是 [B dismissViewControllerAnimated:YES completion:nil]; - AnonymousRacer
当您执行[B dismissViewControllerAnimate:YES completion:nil]时,它将会停留在B而不是A。这就是苹果文档所说的,也经过了测试... - fillky
@Wain 这里没有什么可以展示的...这是一个非常简单的用例,最多只需要一行代码。所有的segue都是通过IB完成的,只有dismiss是以编程方式执行的… - fillky
我想你可以完全清除视图控制器栈(不带动画),然后从应用代理重新加载A视图控制器(带动画)。为了使过渡顺畅,你可能应该先截取C的屏幕截图,这样在呈现A时就能够进行平滑的动画过渡。对于我的经验水平来说,这很复杂,所以我没有测试过,也不知道是否可行。 - Andrej
2个回答

0
在这种情况下最好的解决方案是 Unwind Segue。你可以直接移动到任何视图控制器。

嘿,这是一个不错的解决方法,也许可以工作,但对于我们中的许多人来说并不可用,因为我们正在努力处理以编程方式创建的视图控制器层次结构... - fillky

0

无法同时解雇B和C。在iOS中,当两个动画有关联时,有时会发生这种情况-我不知道确切的细节。

如果在C的解雇完成块中设置断点,则可能会看到finished参数为false,表示已中断C的动画。

我认为正确的解决方案是仅解雇B。由于C是由B呈现的,因此C将自动消失。


你说得对,这就是我现在所做的。在我的代码示例中,解雇只在一个控制器上调用一次,并且根据苹果文档,C也应该随着B一起消失,这是正确的,但问题出在附加的gif动画中捕获的地方。你可以看到C不知何故消失了... - fillky
1
哦,我明白你的意思了。如果你在控制器中嵌套另一个控制器,那么可能应该使用UINavigationController而不是弹出视图。你可以修改UINavigationController的转场代理来实现向上滑动的动画效果。虽然这不是最好的解决方案,但我已经想不到更好的方法了 :) - Khanh Nguyen

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