SwiftUI中ForEach传值至DetailView预览报错:缺少item参数的解决
报错原因与修复方案
报错原因
你的DetailView结构体定义了一个必填的item参数(类型为Core Data的Item实体,用@ObservedObject修饰),但在DetailView_Previews中调用DetailView()时,没有传入这个item参数。Swift要求所有非可选的初始化参数必须被赋值,因此触发了Missing argument for parameter 'item' in call错误。
修复方法
需要在预览代码中创建一个用于测试的Item实例,并传入DetailView。由于使用了Core Data,要确保测试item是在预览的上下文环境中创建的。
方案1:在预览中创建测试Item
修改DetailView_Previews代码如下:
struct DetailView_Previews: PreviewProvider { static var previews: some View { // 获取预览上下文 let context = ListViewModel.preview.container.viewContext // 创建测试Item并设置属性 let testItem = Item(context: context) testItem.todaysDate = Date() testItem.hoursSlept = 7.5 testItem.headacheToggle = true // 传入testItem到DetailView DetailView(item: testItem) .environment(\.managedObjectContext, context) } }
方案2:使用已有的预览数据
如果你的ListViewModel.preview中已经预加载了测试Item数据,可以直接取第一个item传入:
struct DetailView_Previews: PreviewProvider { static var previews: some View { let context = ListViewModel.preview.container.viewContext // 从预览上下文获取第一个Item(确保预览数据存在) guard let testItem = try? context.fetch(Item.fetchRequest()).first else { fatalError("No preview items available") } DetailView(item: testItem) .environment(\.managedObjectContext, context) } }
注意:如果采用方案2,要确保ListViewModel.preview的容器中确实存在预创建的Item实例,否则会触发fatalError。
内容的提问来源于stack exchange,提问作者user19978415
相关产品推荐
相关产品推荐

