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

时间:2016-07-25 20:48:45

标签: ios swift cocoa-touch unwind-segue

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

AB在Interface Builder中设置了正常的segue关系,并通过代码调用。我对来自C的{​​{1}}通过代码(实例化和B)执行相同的操作。在少数情况下presentViewController(_:)中的某个操作会导致C存在问题,因此我必须解雇这两个问题。

到目前为止,我一直在B拨打dismissViewControllerAnimated(_:),然后检查C的{​​{1}}是否应该被解雇,并以同样的方式解雇如果是这样。在此过程中,用户通过VC层次结构被抛回,看着空视图返回到他们的位置,留出时间让他们尝试不再有效的控件,并可能导致应用程序崩溃。这是一个相当令人不安的用户体验,我希望消除它。我可以简单地禁用所有内容,但是如果我可以避免它,那就是很多我不想搞砸的控件......

我知道IB支持“展开segues”,它可以同时解除整个VC层次结构,尽管那些似乎只处理故事板中的视图控制器。考虑到我的层次结构的一部分包含在B中,有没有办法以编程方式获取此行为(以viewDidAppear(_:)忽略所有内容)而不必恢复我已经完成的大部分工作?

更新:

所以,我通过传递对呈现视图的引用并在离开之前调用它的dismiss segue来解雇工作正常。这种方法带来了自己的问题和导航控制器的怪异,但通过一些调整它可能是可用的。

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

为了科学,我要坚持下去,直到我决定以太方式为止,然后回答这里任何以谷歌搜索的方式。

更新:

Ew ......看起来这段代码比我想象的要老。我实际上有两个导航控制器,以支持自定义模态动画进出A,并在那里自定义展开segue(你去)。为了获得我想要的动画,我不妨将UINavigationController投入故事板并进行自定义展开。

如果我不关心动画,只需在自定义展开时禁用动画,BC就会立即消失,并且一起消失。麻烦的是,这对我的品味有点震撼......

vacawama的建议实际上很有意义,并且我没有检查文档是正确的! B已经保留了对其C的引用。回到两点是一个捏,简单地回到那个层次结构并解雇我想要的那个。像魅力一样工作,没有动画根本不会发生......

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

2 个答案:

答案 0 :(得分:1)

因此,科学盛行,并找到了解决方案。

如果你不喜欢写自定义的segue和动画师,那真的很痛苦。最终会这样做,但是现在它根本不能启用这个功能更有利可图。 (谢天谢地,我很容易切换到最后)。

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

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

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

来自C相当于goAllTheWayBack()

Gross,但它完成了工作。更多的调整,比如实际上使用故事板(ugh)来解开它并编写一个自定义动画师,它看起来比一条毯子里的猪更漂亮!

我要宣布这匹马好坏死了。谢谢大家!

答案 1 :(得分:0)

您是否尝试过Atomic Object's approach

TL; DR

使用IB和ctrl-拖动'C'视图控制器(黄色)到'退出',

选择'prepareForUnwind',

给unwind segue一个标识符,

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