遇到线程 1:使用自定义 segue 时 EXC_BAD_ACCESS (code=2)
Encounter Thread 1: EXC_BAD_ACCESS (code=2) when using custom segue
我在这个错误上坚持了将近一个月。我创建了一个名为 SegueFromRight 的自定义转场。我几乎是从一些在线教程中复制代码。 segue 对我的 loginView 有效,但它总是在稍后的场景中崩溃。视图已经呈现,动画也已执行。它在执行 segue 几秒钟后崩溃并给了我以下错误:
Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeed362ff8)
我检查了我的 View,没有找到任何悬挂的插座。如果我使用像 Show 或 Show Detail 这样的标准 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
})
}
}
你的行为是违法的。您不能像那样对目标视图执行转换或将目标视图直接添加到源视图。如果您的目标是使用自定义动画进行演示,则必须为您的演示编写正确构造的自定义过渡动画。您使用自定义 segue 的事实可以帮助您封装自定义过渡动画代码,但它不会改变您必须如何执行此操作的规则。您必须将目标视图控制器的 modalPresentationStyle
设置为 .custom
,设置其 transitioningDelegate
,并提供 UIViewControllerTransitioningDelegate 或 UIPresentationController 子类或两者,就像任何自定义演示动画一样。
我在这个错误上坚持了将近一个月。我创建了一个名为 SegueFromRight 的自定义转场。我几乎是从一些在线教程中复制代码。 segue 对我的 loginView 有效,但它总是在稍后的场景中崩溃。视图已经呈现,动画也已执行。它在执行 segue 几秒钟后崩溃并给了我以下错误:
Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeed362ff8)
我检查了我的 View,没有找到任何悬挂的插座。如果我使用像 Show 或 Show Detail 这样的标准 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
})
}
}
你的行为是违法的。您不能像那样对目标视图执行转换或将目标视图直接添加到源视图。如果您的目标是使用自定义动画进行演示,则必须为您的演示编写正确构造的自定义过渡动画。您使用自定义 segue 的事实可以帮助您封装自定义过渡动画代码,但它不会改变您必须如何执行此操作的规则。您必须将目标视图控制器的 modalPresentationStyle
设置为 .custom
,设置其 transitioningDelegate
,并提供 UIViewControllerTransitioningDelegate 或 UIPresentationController 子类或两者,就像任何自定义演示动画一样。