【问题标题】:Dismissing modal view controller stack关闭模态视图控制器堆栈
【发布时间】:2016-12-11 17:39:35
【问题描述】:

给定以下视图控制器布局。

我们首先在A 上呈现B,然后在B 上呈现C,从而构建了一组模态视图控制器。根据Apple documentation on dismiss(animated:completion:),在A 上调用它实际上应该以动画方式关闭最顶层的视图控制器(在这种情况下为C),并且所有中间视图控制器都没有动画。但发生的情况是 C 在没有动画的情况下被解雇,B 以动画方式被解雇。

我提出了一个 Xcode project on GitHub 来复制这种行为。我是遗漏了什么还是我误解了这里的文档?

【问题讨论】:

  • 你有没有想过这个问题?我刚碰到它,我很沮丧。似乎这种行为已经存在于多个版本的 iOS 中,并且仍然存在于 iOS 10 中。这直接违背了记录的行为(和常识),即您将为 TOP 大多数视图控制器而不是中间视图控制器设置动画。
  • 不,我仍然面临这个问题。也许是时候提交雷达了……
  • 刚找到一个……它被复制了,然后由于不活动而关闭。还找到了一个快速演示该问题的测试项目。 Apple 认为他们在 8.3 中解决了这个问题,但用户从未更新,所以他们关闭了这个错误……但它仍然存在,今天仍然存在。
  • 我刚刚向 Apple 提交了错误报告 #28713792。我包含了其他人很好地创建的测试项目,希望它很容易理解。
  • 会骗那个。感谢您的努力!

标签: ios cocoa-touch uikit


【解决方案1】:

我猜你从 A 到 B 的转场也是模态的?在这种情况下,从 A 调用的 dismiss 函数想要关闭视图,该视图立即位于 A 之上,即 B。C 只是被隐藏以向您展示 B 的动画隐藏。从这个意义上说,您不能堆叠通过模态segues查看并使用dismiss函数关闭顶部,如果你回到那么远的话。不过,如果从 B 调用 dismiss 以解除 C,dismiss 将按预期工作。

【讨论】:

  • 虽然这可能不稳定,但这并不是文档中所说的预期行为。
  • @MobileVet 谢谢!我不知道这是在文档中指定的。我还看到您已向 Apple 提交了错误报告。让我们看看发生了什么。说实话,我希望该堆栈也能正常工作,因为拥有它可能非常有用。
【解决方案2】:

在网上浏览并尝试了各种“解决方案”之后,很明显这是 iOS 中的一个实际错误。它从 iOS 8 开始就存在......并且仍然存在于 iOS 10 中。它最初是在 iOS 8 中报告的,但该解决方案从未经过验证,Apple 由于不活动而自动关闭了雷达。

我已提交新雷达,因为这与 dismissViewController 的文档直接矛盾

如果你连续呈现几个视图控制器,从而构建一个 呈现的视图控制器堆栈,调用此方法(意味着 -[UIViewControllerdismissViewControllerAnimated:completion]) 在堆栈中较低的视图控制器上关闭其直接子视图 控制器和堆栈上该子级上方的所有视图控制器。 发生这种情况时,只有最顶层的视图会在动画中消失 时尚;任何中间视图控制器都被简单地从 堆栈。

问题的清晰可视化,包括预期结果和实际结果。感谢 Boris Survorov 的测试项目和可视化。

【讨论】:

  • 作为更新,这已在 iOS 11.x 中解决,但仍未修复。
  • 刚刚下载并在 iOS 12 上运行了测试项目。不,仍然损坏。
  • Annnnnd 在 iOS 13 上仍然损坏
  • 我从 Apple 内部的一些人那里听说...如果不是回归错误,则不会处理。很臭,但解释了为什么这么多年都没有解决这个问题。
【解决方案3】:

我遇到了同样的问题,我发现这是一个可行的解决方法。当您需要关闭整个堆栈时,请在 A 中执行此代码:

viewControllerB.view.isHidden = true
viewControllerC.dismiss(animated: true) // or viewControllerB.dismiss(animated:true) - it should produce the same result: dismiss viewControllerC
dismiss(animated: false) // dismisses viewControllerB

这应该会产生预期的行为。

【讨论】:

  • @stanić 好电话...如果您有很多 VC 堆叠起来会有点麻烦...但确实可以完成工作。
  • @stanić 这在 iOS 10 中对您有用吗?动画正在进行时,最上面的控制器后面出现黑屏。
  • @MikeBernardo 是的,它适用于我的 iOS 10 和 iOS 11。如果没有更多详细信息,很难说出您的案例可能存在什么问题。我建议打开一个单独的问题。
  • @SrđanStanić 谢谢,我会提出一个新问题。同时,我很好奇是否有人可以使用此示例进行复制:github.com/mikebernardo2000/ModalDismissTest
  • 好的,我得到了这个工作。缺少的部分是您需要将 viewControllerB 上的 modalPresentationStyle 设置为“自定义”。如果不这样做,你会得到我上面提到的黑屏。
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
相关资源
最近更新 更多