使用自定义segue时遇到线程1:EXC_BAD_ACCESS(code = 2)

时间:2018-10-28 21:07:44

标签: swift uiviewcontroller swift4 uistoryboardsegue presentviewcontroller

我坚持这个错误将近一个月了。我创建了一个名为SegueFromRight的自定义segue。我几乎从一些在线教程中复制了代码。 segue为我的loginView工作,但始终在以后的场景中崩溃。视图已经呈现,动画也已执行。在执行segue后几秒钟,它崩溃了,并给了我以下错误:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeed362ff8)

我检查了我的视图,但没有找到任何悬挂的出口。如果我使用Show或Show Detail这样的标准segue不会发生此错误,这是非常奇怪的。仅当我尝试使用此自定义segue时才发生。错误发生在该行:

src.present(dst, animated: false, completion: nil)

完整的代码粘贴在下面。该行调用的代码是用汇编语言编写的(我猜是吗?)。所以我很难调试。我确实调查过。该错误发生在libMainThreadChecker.dylib`checker_c的最低位置,在presentViewController中被调用。给出错误的行是:

0x1064f8d98 <+26>:  callq  0x1064fa3da               ; symbol stub for: pthread_main_np

任何人都可以识别我的问题吗?非常感谢!而且,如果您需要更多代码,请随时发表评论。

class SegueFromRight: UIStoryboardSegue {

    override func perform() {
        moveInFromRight()
    }

    func moveInFromRight() {
        let src = self.source
        let dst = self.destination

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

        UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseInOut, animations: {
            dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
        }, completion: { finished in
            src.present(dst, animated: false, completion: nil) // gives the error
        })
    }

}

1 个答案:

答案 0 :(得分:1)

您所做的是违法的。您不能在目标视图上执行转换,或将目标视图直接添加到源视图中。如果您的目标是使用自定义动画进行演示,则必须为演示文稿编写适当构造的自定义过渡动画。您正在使用自定义序列的事实可以帮助您封装自定义过渡动画代码,但不会改变您必须执行的规则。您必须将目标视图控制器的modalPresentationStyle设置为.custom,将其设置为transitioningDelegate,并提供UIViewControllerTransitioningDelegate或UIPresentationController子类或两者,与任何自定义演示动画一样。