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

SwiftUI:如何为Preview传递Core Data SectionedFetchResults

给接收SectionedFetchResults的子视图做预览数据

SectionedFetchResults是Core Data内部管理的类型,没法手动直接构造实例,得靠内存型Core Data测试栈生成测试数据,再通过@SectionedFetchRequest拿到数据传给子视图,具体步骤如下:

1. 搞个预览专用的Core Data容器

先写个工具函数,创建只用于预览的内存容器,不会影响真实数据:

import CoreData

func makePreviewPersistentContainer() -> NSPersistentContainer {
    let container = NSPersistentContainer(name: "你的数据模型文件名")
    let storeDesc = NSPersistentStoreDescription()
    storeDesc.type = NSInMemoryStoreType // 用内存存测试数据,退出就消失
    container.persistentStoreDescriptions = [storeDesc]
    
    container.loadPersistentStores { _, error in
        if let err = error as NSError? {
            fatalError("预览容器加载失败:\(err), \(err.userInfo)")
        }
    }
    return container
}

2. 生成测试数据

写个函数往预览上下文里塞测试用的实体数据,按你的分组规则来:

// 假设你的实体是TodoItem,分组字段是groupName(字符串类型)
func seedTestData(context: NSManagedObjectContext) {
    // 第一组:工作
    let workItem1 = TodoItem(context: context)
    workItem1.title = "写接口文档"
    workItem1.groupName = "工作"
    
    let workItem2 = TodoItem(context: context)
    workItem2.title = "调试API"
    workItem2.groupName = "工作"
    
    // 第二组:生活
    let lifeItem1 = TodoItem(context: context)
    lifeItem1.title = "买牛奶"
    lifeItem1.groupName = "生活"
    
    // 保存测试数据
    do {
        try context.save()
    } catch {
        let nsErr = error as NSError
        fatalError("保存测试数据失败:\(nsErr), \(nsErr.userInfo)")
    }
}

3. 写预览代码

搞个预览用的逻辑,拿到SectionedFetchResults再传给子视图:

struct TodoListView_Previews: PreviewProvider {
    static let previewContainer = makePreviewPersistentContainer()
    
    // 通过SectionedFetchRequest获取测试分组数据
    @SectionedFetchRequest(
        sectionIdentifier: \TodoItem.groupName,
        sortDescriptors: [NSSortDescriptor(keyPath: \TodoItem.title, ascending: true)],
        animation: .default
    ) static var sectionedResults: SectionedFetchResults<String, TodoItem>
    
    static var previews: some View {
        // 把拿到的分组数据传给子视图,同时注入预览上下文
        TodoListView(sectionedResults: sectionedResults)
            .environment(\.managedObjectContext, previewContainer.viewContext)
    }
    
    // 静态初始化时提前填充测试数据
    static init() {
        seedTestData(context: previewContainer.viewContext)
    }
}

注意点

  • 把代码里的TodoItem、groupName、你的数据模型文件名换成你自己的实体类、分组字段和数据模型名称。
  • 如果你的子视图是通过环境上下文自行发起请求,那直接在预览里注入测试上下文就行,不用传SectionedFetchResults参数。

内容的提问来源于stack exchange,提问作者alpennec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:17:18