You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向modelContext添加数据后Sheet Dismiss动画失效问题求助

Sheet关闭无平滑过渡问题

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

Sheet无平滑过渡直接消失

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:56:07