Segue 转换到错误的页面 Swift Xcode

Segue transitions to the wrong page Swift Xcode

我正在尝试创建一系列使用自定义 segues 协同工作的页面。在我让它们在某个系列中执行之前,这些 segue 工作正常。从 VC1 我通过默认模式转场转到 VC2(它在原始转场上弹出)。然后,从 VC2 我使用自定义水平转场(下面的代码)转到 VC3。最后,我使用自定义展开水平转场从 VC3 返回到 VC1。问题是,当我返回 VC1 时,出现的却是 VC2。我查了一下,ViewDidLoad出现时并没有在VC2中执行,但是触发时我还是可以与之交互的。我对正在发生的事情的最佳猜测是 VC2 覆盖了 VC1,所以当我返回 VC1 时,VC2 显示在它上面。即使这是问题所在,我也不知道如何解决。代码如下:

水平转场:

class HorizontalSegue: UIStoryboardSegue {

    override func perform() {
        let src = self.source as UIViewController
        let dst = self.destination as UIViewController

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)

        UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseOut], animations: {
            dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
        },
            completion: { finished in
                src.present(dst, animated: false, completion: nil)
        })
    }
}

展开水平 Segue:

class UnwindHorizontalSegue: UIStoryboardSegue {

    override func perform() {
        let src = self.source as UIViewController
        let dst = self.destination as UIViewController

        src.view.superview?.insertSubview(dst.view, belowSubview: src.view)
        src.view.transform = CGAffineTransform(translationX: 0, y: 0)

        UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseIn], animations: {
            src.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)
        },
            completion: { finished in
                src.dismiss(animated: false, completion: nil)
        })
    }
}

我注意到的第一件事是你说 ViewDidLoad 不为 VC2 调用。请查看是否正在调用 ViewDidAppear(或将出现)。

ViewDidLoad 仅在视图加载时调用(最初,之前不存在)。 ViewDidAppear 应始终在将视图带入用户屏幕时触发。

之后,在您的自定义 UIStoryBoardSegue 中登录 dst。如果那是 VC2 的一个实例,那么您只是推错了视图控制器。

我还看到您在 UIStoryboardSegue 中使用了 src.presentsrc.dismiss。这意味着您实际上并不是在推送视图,而是向它们展示活动视图控制器的 "on top"。尝试重新考虑该逻辑,因为这很可能是问题所在。

我宁愿尝试推动视图控制器(通常,而不是 'presenting' 它们)并更改 UIStoryboardSegue 外观以伪造动画,如果那是你想要的。