自定义Segue提供了线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7ffeedc6efe8)

时间:2018-10-13 19:54:22

标签: swift uinavigationcontroller swift4 segue cgaffinetransform

我想使用CGAffineTransform实现自定义序列。我在多个转换中使用它。但是segue无法正常工作,它甚至在其中一个场景中给出了致命错误EXC_BAD_ACCESS。奇怪的是,segue并没有在第一个场景LoginViewController上设置动画。因此,下一个场景基本上从无处弹出。但是程序没有崩溃。它确实给了我一条错误消息:

Unbalanced calls to begin/end appearance transitions for <MyTritonLink.TabBarDataController: 0x7faf351df200>.

segue确实在以下场景执行了动画。它的执行方式非常奇怪。一切都是从右推动的,但导航栏根本没有动。并且在执行src.present时崩溃(图片和代码附在下面)。当应用程序崩溃时,导航栏仍是最后一个场景的导航条,但其他所有内容均已从右侧推入。

我能想到的一些可能原因是: 我将几乎每个场景都嵌入了Navigation Controller,并对其进行了自定义以能够传递数据。因此,在prepare方法中,我首先传递了数据:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "CourseTableViewSegue" {
        // Pass data
        (segue.destination as! NavigationDataController).browser = browser
        (segue.destination as! NavigationDataController).webView = webView
        (segue.destination as! NavigationDataController).selectedQuarter = selectedQuarter        
    }
}

这可能会引起一些问题,但我不确定是可以的。也可能将场景嵌入导航控制器会搞乱自定义序列吗?数周来我一直在努力解决这个问题。我设法解决了这个问题,但是我意识到我需要这个动画。感谢任何帮助我的人。如果您需要更多代码,请随时询问。

补习班:

class SegueFromRight: UIStoryboardSegue {
    override func perform() {
        let src = self.source
        let dst = self.destination

        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.5, delay: 0, options: .curveEaseInOut, animations: {dst.view.transform = CGAffineTransform(translationX: 0, y: 0)}, completion: {finished in src.present(dst, animated: false, completion: nil)}
        )
    }
}

Source View Controller

After animation (crashed)

Code and error message

0 个答案:

没有答案