自定义segue如何支持在调用链中先前对viewcontroller进行展开?

时间:2016-08-05 20:54:07

标签: ios uiviewcontroller uistoryboardsegue unwind-segue

我有一个使用没有导航控制器的segues的故事板应用程序。我们有一个简单的自定义segue,如下面的代码,适用于正常情况。然而,我们有一种情况,在调用一系列视图控制器A-> B-> C后,我们有时会喜欢C直接退回到A.这对内置过渡很好,因为UIKit似乎忽略了介入控制器没有任何问题,正确显示从C回到A的过渡。

然而,在我的自定义segue中,我不确定是否或如何解雇干预视图控制器。假设下面的代码知道它正在展开并且目标视图控制器不是呈现源视图控制器的那个。这是我尝试过的:

1)如果我只是保留代码似乎工作正常!但是我为视图控制器C收到错误“不平衡调用开始/结束外观转换”。 2)如果我更改代码以首先关闭视图控制器B,我看到转换为B.我没有看到任何方法来抑制它。

从我所读到的内容来看,当您对转换进行重叠调用时,通常会出现非平衡调用错误。但是,由于UIKit正在解雇他们(大概),所以我不知道这是怎么回事。我也尝试将完成工作分派给主线程(试图让它进入下一个运行循环)但没有变化。

class MyCustomSegue: UIStoryboardSegue {
    override func perform()
    {
        let sourceView = sourceViewController.view
        let destView = destinationViewController.view
        let unwinding = // …

        // Put the destination view on top
        sourceView.superview?.insertSubview(destView, aboveSubview: sourceView)

        // Do the animation
        UIView.animateWithDuration(1.0, animations: { complete in
        } ) { (Finished) -> Void in
            if unwinding {
                // calling this on presenter or presentee is equivalent
                self.sourceViewController.dismissViewControllerAnimated(false, completion: nil)
            } else {
                self.sourceViewController.presentViewController(self.destinationViewController, animated: false, completion: nil)
            }
        }
    }
}

0 个答案:

没有答案