【问题标题】:Dismissing multiple view controllers at once with strange behaviour以奇怪的行为一次关闭多个视图控制器
【发布时间】:2016-08-25 09:19:07
【问题描述】:

这是一个常见问题,对于仍然不知道如何正确处理该问题的每个人来说,这是一个场景。

模态显示的视图控制器 A -> B -> C

现在你想在一个平滑的动画着陆时用 B 解除 C 以查看控制器 A。所以苹果文档说你只需要执行:

[A dismissViewConttollerAnimated:YES completion:nil];

C 和 B 应该很好地消失了。这确实是经常需要的场景,我对常见用例无法正常工作感到非常失望。 Why the top view controller C disappears in a moment and B view controller appears with dismissing animation instead of C to be visible for the whole animation process? 我真的很想只看到 C 视图控制器被解雇。

【问题讨论】:

  • 展示你的演示代码
  • 它的控制器 B 应该被解散而不是 A,因为你想降落在 A 上。理想情况下,它应该是 [B dismissViewControllerAnimated:YES completion:nil];
  • 当您执行 [B dismissViewControllerAnimate:YES completion:nil] 时,它将落在 B 而不是 A。这就是苹果文档所说的并且也经过测试......
  • @Wain 有第 n 个要展示...这是非常简单的用例,没有超过 1 行代码。所有的 segues 都是通过 IB 完成的,只有以编程方式执行解雇...
  • 我猜你可以做的是完全清除视图控制器堆栈(没有动画),然后从应用程序委托中重新(动画)加载视图控制器 A。并且要进行平滑过渡,您可能应该截取 C 的屏幕截图,以便在呈现 A 的同时进行平滑的动画过渡。对于我的经验水平来说,它非常复杂,所以没有测试它,我不知道它是否会工作。

标签: ios objective-c cocoa-touch


【解决方案1】:

在这种情况下使用的最佳解决方案是Unwind Segue。您可以直接将开关移动到层次结构中的任何视图控制器。

【讨论】:

  • 是的,这是一个很好的解决方法,也许可以工作,但对于我们许多在以编程方式创建的视图控制器层次结构中苦苦挣扎的人来说不可用......
【解决方案2】:

B 的解除不能与 C 的解除同时进行。这有时会在 iOS 中发生,当两个动画以某种方式相关时 - 我不知道确切的细节。

如果你在C的dismissal completion块中设置断点,你可能会看到finished参数为false,表示C的动画已经中断。

我认为正确的解决方案是只解雇 B。 C 会自动消失,因为它是由 B 呈现的。

【讨论】:

  • 你是对的,这就是我现在所做的。我的代码示例中的解雇仅在 A 控制器上调用一次,并且关于苹果文档 C 也应该与 B 一起消失,这是真的,但问题出在附加 gif 中捕获的动画中。你可以看到 C 不知何故消失了……
  • 哦,我明白你的意思了。我认为如果您在控制器中展示控制器,那么也许您应该使用 UINavigationController 而不是演示文稿。您可以修改UINavigationController 的过渡代理来制作上滑动画。也许不是最好的解决方案,但我有点想不通:)
猜你喜欢
  • 2011-09-27
  • 2011-03-14
  • 1970-01-01
  • 2021-09-28
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多