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
相关产品推荐
相关产品推荐

