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

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,需要做两个调整:

  1. 在预览容器中插入数据后保存上下文,确保数据被持久化到内存容器;
  2. 给空数据状态添加占位视图,避免预览显示空白。

第一步:修改预览容器代码

@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:14:51