SwiftData记录在Xcode预览中索引越界问题及解决咨询
解决Xcode预览中@Query数据加载延迟导致的视图渲染问题
方案1:直接从预览容器同步获取数据(最可靠)
既然你的previewContainer已经提前初始化并插入了测试数据,完全可以跳过@Query的异步加载流程,直接从容器的上下文同步取出数据,这样预览能立即渲染目标视图:
#Preview { let container = previewContainer // 从预览容器的主上下文同步查询数据 guard let vegetable = try? container.mainContext.fetch(FetchDescriptor<Vegetable>()).first else { fatalError("预览容器中未找到Vegetable数据") } NavigationStack { VegetableDetailScreen(vegetable: vegetable) }.modelContainer(container) }
方案2:补全空状态占位并确保预览容器数据已保存
如果坚持使用@Query,需要做两个调整:
- 在预览容器中插入数据后保存上下文,确保数据被持久化到内存容器;
- 给空数据状态添加占位视图,避免预览显示空白。
第一步:修改预览容器代码
@MainActor let previewContainer: ModelContainer = { do { let container = try ModelContainer(for: Vegetable.self, MyGardenVegetable.self, configurations: ModelConfiguration(isStoredInMemoryOnly: true)) let vegetables = PreviewData.loadVegetables() for vegetable in vegetables { let vegetableModel = Vegetable(vegetableDTO: vegetable) container.mainContext.insert(vegetableModel) } // 新增:保存上下文,确保数据被持久化 try container.mainContext.save() return container } catch { fatalError("Failed to create container.") } }()
第二步:修改预览代码
#Preview { @Previewable @Query var vegetables: [Vegetable] NavigationStack { if let vegetable = vegetables.first { VegetableDetailScreen(vegetable: vegetable) } else { // 数据加载完成前显示占位视图 ProgressView("加载中...") .navigationTitle("蔬菜详情") } }.modelContainer(previewContainer) }
方案3:使用静态测试数据直接初始化视图
如果只是为了预览VegetableDetailScreen的UI,甚至可以直接用静态测试数据创建实例,完全绕过Core Data容器:
#Preview { // 直接用PreviewData中的数据创建Vegetable实例 guard let testVegetableDTO = PreviewData.loadVegetables().first else { fatalError("无测试数据") } let testVegetable = Vegetable(vegetableDTO: testVegetableDTO) NavigationStack { VegetableDetailScreen(vegetable: testVegetable) } }
内容的提问来源于stack exchange,提问作者user19037628
相关产品推荐
相关产品推荐

