Ios 有没有办法以编程方式创建和使用展开序列?

Ios 有没有办法以编程方式创建和使用展开序列?,ios,swift,cocoa-touch,unwind-segue,Ios,Swift,Cocoa Touch,Unwind Segue,我有一系列的三个视图控制器,前两个被包装在UINavigationController中,由默认的Main.storyboard文件管理。让我们分别称它们为A和B。我在整个文件中有更多的视图控制器,每个视图控制器分别实例化和管理,尽管我正在努力将它们移动到所有代码解决方案中。前面提到的第三视图控制器我已经在代码中(C)是一个在不同时间由B实例化和呈现的控制器 A和B在Interface Builder中具有正常的序列关系设置,并通过代码调用。我通过代码(实例化和presentViewContro

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

A
B
在Interface Builder中具有正常的序列关系设置,并通过代码调用。我通过代码(实例化和
presentViewController(u:)
)从
B
C
执行相同的操作。在一些情况下,
C
中的一个动作会使
B
的存在理由无效,因此我必须将两者都忽略

到目前为止,我一直在从
C
调用
dismissViewControllerAnimated(:)
,然后检查
B
viewdide(:)
是否应该解除它,如果是,则以同样的方式解除它。在这个过程中,用户通过VC层次结构返回,看到空视图飞回它们的来源,留下时间让他们尝试不再工作的控件,并可能导致应用程序崩溃。这是一个相当令人不安的用户体验,我希望消除它。我可以简单地禁用所有功能,但如果可以避免的话,我不想弄乱很多控件

我知道IB支持“展开分段”,这可以同时消除整个VC层次结构,尽管它们似乎只处理情节提要中的视图控制器。考虑到我的层次结构的一部分包含在
UINavigationController
中,是否有任何方法可以通过编程方式获得这种行为(将所有内容都忽略到
A
),而不必还原我已经完成的大部分工作


更新:

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

老实说,在这一点上完全删除该功能要容易得多,因为这主要是一种方便

为了科学起见,我会一直坚持下去,直到我决定走哪条路,然后在这里为任何通过谷歌搜索这条路的人回答


更新:

嗯。。。这段代码似乎比我想象的要老。实际上,我有两个导航控制器,用于支持进出
B
的自定义模式动画,并在那里有一个自定义的展开序列(就这样)。为了得到我想要的动画,我还可以将
C
扔进故事板,制作一个自定义的放松序列

如果我不关心动画,只需在自定义展开时禁用动画即可使
B
C
迅速消失,并同时消失。问题是,这对我的口味来说有点震撼

的建议实际上很有道理,我没有检查文档,这是对的
UIViewController
已经保留了对其
presentingViewController
的引用。后退两步是一个紧要关头,简单地爬回那个等级制度,并抛弃我想要的那个。工作就像一个魅力,没有动画根本不会发生

我将很快在这里发布一个答案,其中包含我迄今为止的发现。

你试过了吗

TL;博士

使用IB和ctrl键将“C”视图控制器(黄色)拖动到“退出”位置

选择“prepareForUnwind”

为展开段指定一个标识符


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

因此,科学占了上风,找到了解决方案

如果你不喜欢写自定义的片段和动画,那真的很痛苦。我最终会这么做,但现在完全不启用这个功能更有利可图。(谢天谢地,很容易在我这边切换)

我发现在
B
上运行我的dismise segue(我使用一个自定义的segue),然后dismissing
C
就可以了,只要我不使用动画。没有什么意外

此外,通过运行以下命令,我可以在一行中获得相同的效果(动画不重要,因此自定义segue也不重要):

presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
C
goAllTheWayBack()

真恶心,但它完成了任务。再加一点调整,比如使用故事板(ugh)进行放松,并编写自定义动画师,它看起来比毛毯里的猪更奇特


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

没有故事板,你不能使用分段,正常或放松。由于您有一个导航控制器,您可以直接操作它的
viewControllers
属性,“尽管我正在努力将它们移动到所有代码解决方案中”。。。你为什么这么做?这只会使项目更难维护,而且你做的工作比你必须做的要多。@Paulw11这是我考虑过的,但我还没有机会尝试自己。。。当我呈现
C
时,我是否会将引用传递给导航控制器?我现在就尝试一下,然后返回找到的内容。您可以从C的
navigationController
属性访问navigationController。当您确定需要从C返回A时,只需获取此属性,创建一个仅包含A的数组(即navigationController的
ViewController
属性中的第一个元素)和调用
SetViewController:animated:
,如果它们都以模式显示,然后您可以使用
self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true,completion:nil)
返回两个视图控制器。