我有一系列三个视图控制器,前两个控制器包含在UINavigationController中,由默认的Main.storyboard
文件管理。我们分别称他们为A
和B
。我在整个文件中有更多的视图控制器,每个都是单独实例化和管理的,尽管我正在努力将它们转移到全代码解决方案中。我已经在代码(C
)中的上述第三个视图控制器是在B
实例化和呈现的不同时间的那个。
A
和B
在Interface Builder中设置了正常的segue关系,并通过代码调用。我对来自C
的{{1}}通过代码(实例化和B
)执行相同的操作。在少数情况下presentViewController(_:)
中的某个操作会导致C
存在问题,因此我必须解雇这两个问题。
到目前为止,我一直在B
拨打dismissViewControllerAnimated(_:)
,然后检查C
的{{1}}是否应该被解雇,并以同样的方式解雇如果是这样。在此过程中,用户通过VC层次结构被抛回,看着空视图返回到他们的位置,留出时间让他们尝试不再有效的控件,并可能导致应用程序崩溃。这是一个相当令人不安的用户体验,我希望消除它。我可以简单地禁用所有内容,但是如果我可以避免它,那就是很多我不想搞砸的控件......
我知道IB支持“展开segues”,它可以同时解除整个VC层次结构,尽管那些似乎只处理故事板中的视图控制器。考虑到我的层次结构的一部分包含在B
中,有没有办法以编程方式获取此行为(以viewDidAppear(_:)
忽略所有内容)而不必恢复我已经完成的大部分工作?
更新:
所以,我通过传递对呈现视图的引用并在离开之前调用它的dismiss segue来解雇工作正常。这种方法带来了自己的问题和导航控制器的怪异,但通过一些调整它可能是可用的。
老实说,此时完全删除该功能要容易得多,因为这主要是为了方便。
为了科学,我要坚持下去,直到我决定以太方式为止,然后回答这里任何以谷歌搜索的方式。
更新:
Ew ......看起来这段代码比我想象的要老。我实际上有两个导航控制器,以支持自定义模态动画进出A
,并在那里自定义展开segue(你去)。为了获得我想要的动画,我不妨将UINavigationController
投入故事板并进行自定义展开。
如果我不关心动画,只需在自定义展开时禁用动画,B
和C
就会立即消失,并且一起消失。麻烦的是,这对我的品味有点震撼......
vacawama的建议实际上很有意义,并且我没有检查文档是正确的! B
已经保留了对其C
的引用。回到两点是一个捏,简单地回到那个层次结构并解雇我想要的那个。像魅力一样工作,没有动画根本不会发生......
我很快就会在这里找到答案。
答案 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”视图控制器。