SwiftData在Mac(适配iPad)环境下模型容器加载崩溃求助
SwiftData 容器加载错误:
loadIssueModelContainer 崩溃问题 错误信息
Fatal error: 'try!' expression unexpectedly raised an error: SwiftData.SwiftDataError(_error: SwiftData.SwiftDataError._Error.loadIssueModelContainer)
复现步骤
- 使用SwiftData构建项目
- 选择运行目标为「My Mac (Designed for iPad)」并启用该目标
- 为项目添加「iCloud」能力,勾选iCloud Documents、CloudKit选项,并指定一个iCloud容器
- 在sheet视图的根层级使用条件判断语句(如
if/switch) - 在sheet视图中通过
@Environment(\.modelContext)获取SwiftData模型上下文
示例代码
App入口代码
@main struct TestApp: App { var sharedModelContainer: ModelContainer = { let schema = Schema([ Item.self, ]) let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) do { return try ModelContainer(for: schema, configurations: [modelConfiguration]) } catch { fatalError("Could not create ModelContainer: \(error)") } }() var body: some Scene { WindowGroup { ContentView() } .modelContainer(sharedModelContainer) } }
主视图代码
struct ContentView: View { @Environment(\.modelContext) private var modelContext @State var showSheet = false var body: some View { Button { showSheet = true } label: { Text("Show Sheet") } .sheet(isPresented: $showSheet) { SheetView() } } }
崩溃触发的Sheet视图代码
struct SheetView: View { @Environment(\.modelContext) private var modelContext var body: some View { if true { // <--- 此处的条件语句会触发崩溃 Text("Hello") } } }
临时修复方案
用容器视图包裹条件语句
将sheet根视图的条件判断放在VStack/HStack等容器内部,避免直接将条件语句作为根视图:struct SheetView: View { @Environment(\.modelContext) private var modelContext var body: some View { VStack { if true { Text("Hello") } } } }显式传递ModelContext
不在sheet视图中通过环境变量获取,而是从父视图直接传递modelContext:// 修改ContentView的sheet初始化代码 .sheet(isPresented: $showSheet) { SheetView(modelContext: modelContext) } // 修改SheetView定义 struct SheetView: View { let modelContext: ModelContext var body: some View { if true { Text("Hello") } } }
内容的提问来源于stack exchange,提问作者fer0n
相关产品推荐
相关产品推荐

