Unwind segue - 返回多个视图
Posted
技术标签:
【中文标题】Unwind segue - 返回多个视图【英文标题】:Unwind segue - going back multiple views 【发布时间】:2015-06-03 13:44:00 【问题描述】:假设我有 3 个 ViewController - A、B 和 C。A 显示 B,B 显示 C。然后我想返回 A 而无需通过(视觉上)B(如主页按钮)。我目前的问题是,当我放松到 A 时,会在短时间内显示 B(调用 viewWillAppear 等方法)。我该如何解决这个问题?
注意 1:与我的真实应用导航树相比,上面的示例高度简化,对我来说,使用 NavigationController 作为所有 A、B 和 C 的容器是不可能的(或至少是不可取的)。很少有原因是在过渡过程中,所有视图中都有复杂的嵌入转场和不同的自定义过渡(几乎所有动画过渡都是完全不同的)。
注意2:我找到了一些定义自定义segue并将其用作Custom Unwind Segue的伪解决方案。这也是不可取的,因为我想使用我已经完成的过渡动画师。
非常感谢任何帮助。
【问题讨论】:
你找到解决这个问题的好方法了吗?我现在也遇到了同样的问题。 【参考方案1】:请注意,这是一个修改后的答案 - 回应下面的第一条评论。
我有一个可行的解决方案。但这可能不合适。我不确定,仅供参考。
按照问题中的描述设置了 3 个视图控制器(第二个是红色的,以便我注意到它在展开期间是否可见)。
在第三个视图控制器 (C) 中通过拖动到 Exit 来创建展开转场。在执行此操作之前,必须将所需的操作添加到第一个和第二个视图控制器中。
下面是 3 个视图控制器的代码。我的修复 - 我使用一个名为 unwindCheck
的全局布尔值作为标志,在展开之前设置为 true
,否则为 false
。如果是true
,那么self.view.hidden = true
in viewWillAppear
是第二个视图控制器。即在放松时隐藏。
请注意,我还在第三个视图控制器上添加了第二个按钮 - 它调用相同的展开 segue - 其标识符属性设置为 "UnwindToFirstSegue"
。第二个按钮不是这个可能的解决方案的必要部分。
class FirstViewController: UIViewController
@IBAction func unwindToFirstViewController(segue: UIStoryboardSegue)
override func viewDidLayoutSubviews()
unwindCheck = false
class SecondViewController: UIViewController
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
if unwindCheck == true
self.view.hidden = true
@IBAction func unwindToSecondViewController(segue: UIStoryboardSegue)
class ThirdViewController: UIViewController
@IBAction func backToA(sender: AnyObject)
performSegueWithIdentifier("UnwindToFirstSegue", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if let identifier = segue.identifier
switch identifier
case "UnwindToFirstSegue":
unwindCheck = true
default:
break
unwind segue 的标识符可以通过在文档大纲中选择它然后转到属性检查器来设置。
【讨论】:
据我所知,从 C 到 A 的转场(B 后面的类型)不是展开转场(如果我错了,请纠正我)。如果我的假设是真的,那么这将开始泄漏……不完全是泄漏,而是在循环 A->B->C->A->B->C->A 之后使用越来越多的内存。 .. A->B->C->A 之后的内存中例如 A 的副本数将为 2,这对应用程序不利。 unwind segue 正在解决这个问题,方法是每次你都不创建新控制器并重用已经创建的副本(不是 100% 正确,但你明白了) 是的。对不起。我现在已经完全修改了我的回答,以回应您的评论。以上是关于Unwind segue - 返回多个视图的主要内容,如果未能解决你的问题,请参考以下文章
unwind segue / performSegueWithIdentifier: 问题