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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:23:19