【问题标题】:Segue transitions to the wrong page Swift XcodeSegue 转换到错误的页面 Swift Xcode
【发布时间】:2019-12-29 03:23:16
【问题描述】:

我正在尝试创建一系列使用自定义 segues 协同工作的页面。这些 segues 工作正常,直到我让它们按某个系列执行。从 VC1 我通过默认的模态转场进入 VC2(它会在原始转场上弹出)。然后,我从 VC2 转到 VC3,使用自定义水平 segue(下面的代码)。最后,我使用自定义展开水平转场从 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)
        })
    }
}

展开水平转场:

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)
        })
    }
}

【问题讨论】:

  • “我的最佳猜测” 为什么猜测? View Debugger 会告诉你具体的情况。
  • 而且无论如何你所做的一切都是非法的。您可以像这样移动视图控制器视图。如果目标是自定义演示动画,那么有一种正确的方法可以做到这一点,而您正在做的不是它。而且您的自定义 segue 结构也是错误的。
  • @matt 好吧,告诉我我在做什么是错误的,这本身并没有多大帮助。什么是“正确的做法”?
  • 如何为呈现/关闭的视图控制器编写自定义过渡动画有很好的文档记录,并且在这里和其他地方已经解释了很多次,包括我。这不是重点。关键是你让自己陷入了一个不连贯的视图控制器情况,现在你意识到了。
  • @matt 实际上,我确实是通过一个相对赞成的堆栈溢出帖子来解决这个问题的。我做错了什么?我确实想知道我做错了什么。

标签: swift xcode uiviewcontroller segue uistoryboardsegue


【解决方案1】:

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

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

之后,将dst 登录到您的自定义UIStoryBoardSegue。如果那是 VC2 的实例,那么您只是在推送错误的视图控制器。

我还看到您在 UIStoryboardSegue 中使用了 src.presentsrc.dismiss。这意味着您实际上并没有推送视图,而是将它们呈现在活动视图控制器的“顶部”。试着重新思考这个逻辑,因为这很可能是问题所在。

我宁愿尝试推动视图控制器(通常,而不是“呈现”它们)并更改 UIStoryboardSegue 外观以伪造动画,如果这是你所追求的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2017-07-01
    • 2017-03-17
    相关资源
    最近更新 更多