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: 问题

iOS 8 unwind segue 导致方向错误

从 Unwind segue 触发时,Push segue 不起作用

在容器视图中导航时,Unwind Segue 不起作用

Unwind segues 不适用于模态视图控制器

Unwind segue 不起作用 SWIFT