向modelContext添加数据后Sheet Dismiss动画失效问题求助
Sheet关闭无平滑过渡问题
我有一个用于向modelContext添加新项的Sheet,但关闭时它没有平滑滑出,而是直接消失。该问题在iPhone XS真机及iPhone 15模拟器上均会出现。

NewTaskView中Sheet的添加按钮代码
Button( "Add new project" ) { modelContext.insert( Project(name: name, about: about, tasks: [Task]()) ) try? modelContext.save() withAnimation { dismiss() } }
ContentView中显示Sheet的按钮代码
Button("\(Image(systemName: "pencil")) New project") { showNewProjectSheet = true } .sheet(isPresented: $showNewProjectSheet) { NewProjectSheet() .presentationDetents([.medium]) }
请问这是性能问题吗?向modelContext添加数据是否会导致系统负载过高?
问题分析与解决建议
这大概率不是性能问题,Core Data插入少量数据的开销极低,不会导致系统负载过高影响动画。问题出在动画的时机和绑定状态的处理上:
- 你现在的代码先执行Core Data操作再调用
withAnimation { dismiss() },但dismiss()本质是修改showNewProjectSheet的绑定值,SwiftUI的Sheet动画依赖这个绑定值的变化被正确纳入动画上下文。 - 另外,
try? modelContext.save()会静默失败,建议换成do-catch捕获错误,方便排查潜在问题,但这不是动画异常的直接原因。
试试这些调整:
- 确保状态修改完全在动画上下文内:
明确拆分数据操作和动画触发,避免潜在的上下文干扰:Button( "Add new project" ) { // 先完成数据操作,这部分不需要动画 let newProject = Project(name: name, about: about, tasks: [Task]()) modelContext.insert(newProject) do { try modelContext.save() } catch { print("项目保存失败:\(error.localizedDescription)") } // 仅让Sheet的状态变化参与动画 withAnimation(.easeOut) { dismiss() } } - 检查绑定状态是否被意外修改:
确认没有其他代码(比如Core Data变更通知触发的视图刷新)在修改showNewProjectSheet,避免打断动画流程。 - 排查Sheet内部的视图刷新干扰:
如果NewProjectSheet内部有监听Core Data变化的视图,插入新数据后可能会立即触发刷新,干扰Sheet的退出动画。可以尝试在Sheet完全关闭后再执行数据保存:// 在ContentView的sheet修饰器中添加onDismiss .sheet(isPresented: $showNewProjectSheet, onDismiss: { // 这里执行保存操作(需要把输入数据传递到ContentView) }) { NewProjectSheet() .presentationDetents([.medium]) }
总结:核心是保证showNewProjectSheet的状态变化被正确包裹在动画上下文里,同时排除其他干扰状态的因素。
内容的提问来源于stack exchange,提问作者Bhorda
相关产品推荐
相关产品推荐

