从Core Data获取闪卡数据遇阻:代码报错求助
解决Core Data闪卡功能的数据获取与代码错误问题
针对两处代码错误的修复与优化
错误1:无法赋值给只读属性flashcards
@FetchRequest包装的属性是只读的,不能通过手动fetch后赋值。正确做法是让@FetchRequest根据传入的闪卡组动态生成过滤条件,自动匹配并获取对应数据。
错误2:NSManagedObjectContext无成员viewContext
dataController.container.viewContext已经返回了NSManagedObjectContext实例,不需要再调用.viewContext,直接使用该实例执行fetch即可(后续我们会用更简洁的@FetchRequest方式替代手动fetch操作)。
完整修复后的代码实现
1. FlashCardSetsView 优化
保持原有逻辑,确保从DataController正确获取闪卡组数据:
import SwiftUI import CoreData struct FlashCardSetsView: View { @EnvironmentObject var dataController: DataController @State private var flashcardSets: [FlashCardData] = [] var body: some View { NavigationView { List(flashcardSets) { set in NavigationLink(destination: FlashCardsListView(flashcardSet: set)) { Text(set.name ?? "Unnamed Set") } } .navigationBarTitle("Flashcard Sets") } .onAppear { dataController.fetchRequest() flashcardSets = dataController.savedFlash } } }
2. FlashCardsListView 重构(核心修复)
通过自定义初始化方法,为@FetchRequest动态设置过滤条件,替代手动fetch操作:
struct FlashCardsListView: View { let flashcardSet: FlashCardData @EnvironmentObject var dataController: DataController // 动态生成带过滤条件的FetchRequest @FetchRequest var flashcards: FetchedResults<FlashCardData> // 自定义初始化方法,传入闪卡组并设置过滤规则 init(flashcardSet: FlashCardData) { self.flashcardSet = flashcardSet // 根据当前闪卡组的tag过滤对应的闪卡 let predicate = NSPredicate(format: "tag == %@", flashcardSet.tag ?? "") _flashcards = FetchRequest( entity: FlashCardData.entity(), sortDescriptors: [], // 可按需添加排序规则,比如[NSSortDescriptor(keyPath: \FlashCardData.createdAt, ascending: true)] predicate: predicate ) } var body: some View { List(flashcards) { flashcard in FlashCardView(card: flashcard) // 恢复闪卡视图的使用 } .navigationBarTitle(flashcardSet.name ?? "Unnamed Set") } }
额外注意事项
- 确保
DataController中的fetchRequest()方法正确获取所有闪卡组数据并赋值给savedFlash属性,若该方法存在问题,可提供代码进一步排查。 - 若需要对闪卡进行排序,可在
FetchRequest的sortDescriptors参数中添加对应的NSSortDescriptor。 - 预览视图需注入
DataController实例,否则会崩溃:
struct FlashCardSetsView_Previews: PreviewProvider { static var previews: some View { FlashCardSetsView() .environmentObject(DataController()) } }
内容的提问来源于stack exchange,提问作者syphixy
相关产品推荐
相关产品推荐

