有没有办法以编程方式创建和使用展开转场?

Is there any way to create and use an unwind segue programmatically?

我有一系列的三个视图控制器,其中前两个包含在 UINavigationController 中,并由默认 Main.storyboard 文件管理。我们分别称它们为 AB。我在整个文件中有更多的视图控制器,每个视图控制器都是单独实例化和管理的,尽管我正在努力将它们移动到全代码解决方案中。我已经在代码中提到的第三个视图控制器 (C) 是一个在不同时间由 B.

实例化和呈现的视图控制器

AB 在 Interface Builder 中设置了正常的 segue 关系,并通过代码调用。我通过代码(实例化和 presentViewController(_:))对 B 中的 C 执行相同的操作。在某些情况下,C 中的操作会使 B's raison d'être 无效,因此我必须忽略两者。

到目前为止,我一直在从 C 调用 dismissViewControllerAnimated(_:),然后检查 BviewDidAppear(_:) 是否应该将其解雇,并将其解雇如果是这样的话。在此过程中,用户被抛回 VC 层次结构,看着空视图飞回它们来的地方,让他们有时间试验不再有效的控件,并可能使应用程序崩溃。这是我希望消除的相当令人不安的用户体验。我可以简单地禁用所有内容,但是如果可以避免的话,我宁愿不去搞乱这些控件...

我知道 IB 支持 "unwind segues,",它可以同时关闭整个 VC 层次结构,尽管它们似乎只处理情节提要中的视图控制器。考虑到我的层次结构的一部分包含在 UINavigationController 中,有什么方法可以通过编程方式获得这种行为(将所有内容都关闭到 A),而不必恢复我已经完成的大部分工作?


更新:

因此,我通过传递对呈现视图的引用并在离开前调用其解散 segue,使解雇正常工作。这种方法有其自身的问题和导航控制器的怪异,但通过一些调整它可能是可用的。

老实说,此时完全删除该功能会容易得多,因为这主要是为了方便。

为了科学起见,我将坚持下去,直到我决定采用以太方式,并在这里回复任何使用这种方式进行谷歌搜索的人。


更新:

呃……这段代码似乎比我想象的要老。我实际上有两个导航控制器,以支持自定义模态动画进出 B,并在那里使用自定义展开转场(你去吧)。为了得到我想要的动画,我还不如把C扔进storyboard做一个自定义unwind segue。

如果我不关心动画,只需在自定义展开时禁用动画即可使 BC 一起迅速消失。麻烦的是,这对我的口味来说有点震撼......

vacawama的建议其实很有道理,我没查文档是对的! UIViewController 已经保留了对其 presentingViewController 的引用。返回两个是一个紧要关头,只需爬回那个层次结构并解雇我想要的那个。像魅力一样工作,没有动画根本不会发生...

我很快就会 post 在这里找到答案。

你试过了吗Atomic Object's approach

TL;DR

使用 IB 并按住 'C' 将视图控制器(黄色)拖动到 'Exit',

select 'prepareForUnwind',

给 unwind segue 一个标识符,

然后 您可以以编程方式执行展开,它将跳过 'B' 视图控制器。

所以,科学占上风,找到了解决办法。

如果您不喜欢编写自定义转场和动画师,那么做起来真的很痛苦。最终会这样做,但现在根本不启用该功能会更有利可图。 (谢天谢地,在我这边很容易切换)。

我发现 运行 我在 B 上关闭了 segue(我使用自定义的),然后关闭 C 就成功了,只要我不使用动画对于任何一个。完全没有意外!

此外,我可以通过 运行:

在一行中获得相同的效果(动画不重要,自定义转场也不重要)
presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

来自 C 相当于 goAllTheWayBack().

恶心,但它完成了工作。稍微调整一下,比如实际使用故事板 (ugh) 来展开它并编写自定义动画师,它看起来比毯子里的猪更漂亮!

我要宣布这匹马完好无损。谢谢大家!