SwiftUI中使用CoreData在新视图无法显示列表项问题求助
SwiftUI CoreData新视图列表无内容问题解决
问题核心
在DatePickerView中可正常添加CoreData数据,但跳转到ReminderListView后列表为空,无法显示已添加的标题和日期。
错误原因
你在跳转新视图时新建了一个CoreDataViewModel实例:
NavigationLink(destination: ReminderListView(vm: CoreDataViewModel()))
每个CoreDataViewModel实例持有独立的NSPersistentContainer,新实例的savedEntities初始为空,自然无法展示之前添加的数据。正确做法是传递当前视图中已存在的ViewModel实例,确保两个视图共享同一CoreData上下文。
修复方案
方案1:直接传递现有ViewModel实例
修改DatePickerView中的NavigationLink代码,传入当前已初始化的vm,而非新建实例:
Button(action: { guard !titleName.isEmpty else {return} reminderSet = dateFormatter.string(from: selectedDate) vm.addReminders(text: titleName, reminderText: reminderSet) titleName = "" }, label: { // 传递当前视图的vm实例 NavigationLink(destination: ReminderListView(vm: vm)) { Text("Set Reminder") .font(.headline) .foregroundColor(.white) .frame(height: 40) .frame(maxWidth: .infinity) .background(Color(#colorLiteral(red: 1, green: 0.1857388616, blue: 0.5733950138, alpha: 1))) .cornerRadius(10) } .padding(.horizontal) })
方案2:通过环境共享ViewModel(更推荐)
多视图共享CoreData场景下,将ViewModel提升至App层级,通过环境传递可避免手动传参的繁琐:
- 在App结构体中初始化全局ViewModel:
@main struct YourReminderApp: App { @StateObject private var coreDataVM = CoreDataViewModel() var body: some Scene { WindowGroup { DatePickerView() .environmentObject(coreDataVM) } } }
- 修改
DatePickerView,通过@EnvironmentObject获取ViewModel:
struct DatePickerView: View { @EnvironmentObject var vm: CoreDataViewModel // 其余@State属性保持不变... }
- 修改
ReminderListView,同样通过@EnvironmentObject获取ViewModel:
struct ReminderListView: View { @EnvironmentObject var vm: CoreDataViewModel var body: some View { // 视图内容保持不变... } }
此方式下所有视图共享同一ViewModel实例,数据同步更可靠。
验证修复
修改完成后,添加提醒再跳转至ReminderListView,即可正常显示已保存的标题和日期。
内容的提问来源于stack exchange,提问作者Shana
相关产品推荐
相关产品推荐

