SwiftUI使用transition实现视图显隐动画时出现未知崩溃如何修复
问题原因
该崩溃分为两类触发场景,对应原因如下:
- 代码兼容问题:在iOS 16.0~16.2、Xcode 14.0~14.2内置的SwiftUI runtime版本中,对
if条件分支内无稳定标识的视图使用.asymmetric非对称转场时,会触发runtime空指针访问。非对称转场需要单独维护插入、移除两套动画状态,无稳定id的条件视图会被SwiftUI视图差分器误判定为可复用同类视图,转场过程中找不到对应视图的上下文快照,直接触发崩溃。 - 预览环境问题:如果报错出现在Xcode Canvas预览阶段,和代码逻辑无关,是预览进程缓存损坏、预览运行架构与项目部署目标不匹配导致的进程崩溃。
修复方案
代码层修复
给条件显示的视图添加固定的稳定唯一标识,帮助SwiftUI正确追踪转场视图的生命周期即可,注意不要使用UUID()这类每次渲染都会变化的动态值作为id,会导致转场完全失效。
修改后的核心代码段:
import SwiftUI struct ContentView: View { @State private var isShowingRed = false var body: some View { VStack { Button("tap me") { withAnimation { isShowingRed.toggle() } } if isShowingRed { Rectangle() .fill(.red) .frame(width: 200, height: 200) .transition(.asymmetric(insertion: .scale, removal: .opacity)) .id("RedRectangleView") // 新增固定id标识 } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
预览环境修复
如果修改代码后预览仍然报未知崩溃,按以下步骤清理缓存即可:
- 按下快捷键
Shift + Command + K清理项目构建文件夹 - 完全退出Xcode,前往
~/Library/Developer/Xcode/DerivedData路径,删除当前项目对应的缓存目录 - 重启Xcode重新构建项目,预览功能即可恢复正常
内容的提问来源于stack exchange,提问作者x3kss
相关产品推荐
相关产品推荐

