如何修复 Swift 中的错误三:“尝试删除包含拒绝辞职的第一响应者的部分...”?

问题描述 投票:0回答:0

我正在使用 CoreData 构建应用程序,在添加数据的阶段,我在运行应用程序时收到错误。以下是完整消息:主题 1:“尝试删除包含拒绝辞职的第一响应者的部分。 被要求辞职的第一响应者(从 -resignFirstResponder 返回 YES):;占位符=输入定义;边框样式=无;背景=<UITextFieldNoBackgroundProvider:0x6000010e3620:文本字段=>;层 = > 包含视图内部: > 索引路径: {长度 = 2,路径 = 0 - 0} 当前第一响应者:<TtGC7SwiftUI15CellHostingViewGVS_15ModifiedContentVS_14_ViewList_ViewVS_26CollectionViewCellModifier:0x13107e200;帧=(0 0;353 361);自动调整大小=W+H;手势识别器 = ;层=>内部co”。

我想问题出在 DataConroller 文件中的两个数组上,或者是在点击“+”按钮时通过 dataController.termdefpairs 运行的 for 循环上。 该视图的要点是能够为抽认卡添加数据,以便能够创建抽认卡堆栈。当我按下“保存”按钮时,我使用 CoreData 保存上下文和所有数据。 这是我输入数据的视图(TermDefinitionView):

    struct TermDefinitionView: View {

    @ObservedObject var dataController = DataController.shared
    @ObservedObject private var viewModel = TermDefinitionViewModel()
    @State var name = ""
    @State var term = ""
    @State var definition = ""
    @State var tag = ""// Separate state for the name
    @Environment(\.managedObjectContext) var managedObjectContext
    @Environment(\.dismiss) var dismiss
    @State var showSet = false
    //@Binding var saveSet: Bool
    @State var isShowingSet = false
    @State private var currentSet: SetEntity?
    //@Binding var redirectToSet: Bool
    
    var body: some View {
        ZStack {
            NavigationStack {
                VStack {
                    Text("Name")
                        .padding(.trailing, 220)
                        .fontWeight(.bold)
                    TextField("Enter name", text: $name)
                        .frame(width: 250)
                        .padding()
                        .overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.gray, lineWidth: 1))
                    
                    List {
                        
//                        ForEach($dataController.termdefpairs) { _ in
//                            TermView(term: term, definition: definition, tag: tag)
//
//                        }
                        
                        ForEach(dataController.termdefpairs.indices, id: \.self) { index in
                            TermView(term: dataController.termdefpairs[index].term, definition: dataController.termdefpairs[index].definition, tag: dataController.termdefpairs[index].tag)

                        }
                        .onDelete { index in
                            self.dataController.termdefpairs.remove(at: index.first!)
                        }
                    }
                    .navigationBarItems(trailing: Button(action: {
                        //for testForm in viewModel.termdefpairs {}
                        dataController.termdefpairs.removeAll()
                        dataController.save() //saving data
                        
                            
                    }) {
                        Text("Save")
//                        
                        
                        
                    })
                    
                    Spacer()
                
                    Button(action: {
                        dataController.addNew()
                        for pair in dataController.termdefpairs {
                            dataController.add(term: pair.term, definition: pair.definition, tag: pair.tag, date: Date(), name: name)
                        }
                        name = ""
                        
                        isShowingSet = true
                        dismiss()
                    }) {
                        Image(systemName: "plus")
                            .resizable()
                            .foregroundColor(.white)
                            .font(.title2)
                            .frame(width: 30, height: 30)
                    }
                    .frame(width: 40, height: 40)
                    .background(Color.blue)
                    .clipShape(Circle())
                    .padding()
                }
                
            }
        }
    
    }
}


struct TermDefinitionView_Previews: PreviewProvider {
    static var previews: some View {
        TermDefinitionView()
    }
}

struct TermView: View {
    @State var term: String
    @State var definition: String
    @State var tag: String
    @State private var isTagExpanded = false
    
    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            
            
                if isTagExpanded {
                    VStack(alignment: .leading, spacing: 8) {
                        Text("Tag")
                            .font(.headline)
                        TextField("Enter tag", text: $tag)
                            .padding()
                            .overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.gray, lineWidth: 1))
                    }
                }
                
                Button(action: {
                    isTagExpanded.toggle()
                }) {
                    HStack { 
                        Spacer()
                        Image(systemName: isTagExpanded ? "minus.circle.fill" : "plus.circle.fill")
                            .resizable()
                            .foregroundColor(.blue)
                            .frame(width: 25, height: 25)
                        Text(isTagExpanded ? "Hide Tag" : "Add Tag")
                            .foregroundColor(.blue)
                            .font(.headline)
                    }
                }
                .padding(.bottom, -25)
            VStack(alignment: .leading, spacing: 8) {
                Text("Term")
                    .font(.headline)
                TextField("Enter term", text: $term)
                    .padding()
                    .overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.gray, lineWidth: 1))
            }
            
            VStack(alignment: .leading, spacing: 8) {
                Text("Definition")
                    .font(.headline)
                TextField("Enter definition", text: $definition)
                    .padding()
                    .overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.gray, lineWidth: 1))
            }
            
            
        }
        .padding()
    }
}



struct TermAndDefinition: Identifiable {
    var id = UUID()
    var term: String
    var definition: String
    var tag: String
}

用于管理数据的DataController:

    class DataController:  ObservableObject {
    static let shared = DataController()
    @Published var termdefpairs: [TermAndDefinition] = []
    @Published var savedFlash: [FlashCardData] = []
   
    let container: NSPersistentContainer

    init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "CoreData")
        
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
       // super.init()
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
            self.container.viewContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
        })
        
        container.viewContext.automaticallyMergesChangesFromParent = true
        fetchRequest()
    }
    func addNew() {
        termdefpairs.append(TermAndDefinition(term: "", definition: "", tag: ""))
//        func add(term: String, definition: String, tag: String, date: Date, name: String) {
//            let data = FlashCardData(context: self.container.viewContext)
//            data.id = UUID()
//            data.definition = definition
//            data.term = term
//            data.tag = tag
//            data.date = date
//            data.name = name
//            fetchRequest()
//        }
    }
    func fetchRequest() {
        let request: NSFetchRequest<FlashCardData> = FlashCardData.fetchRequest()
                let sort = NSSortDescriptor(keyPath: \FlashCardData.date, ascending: false)
                request.sortDescriptors = [sort]

                do {
                    self.savedFlash = try container.viewContext.fetch(request)
                } catch {
                    print("Failed to fetch FlashCardData: \(error)")
                }
    }
    

    func save() {
        do {
            try container.viewContext.save()
            print("Data saved")
        } catch {
            print("We could not save the data...")
        }
    }

    func add(term: String, definition: String, tag: String, date: Date, name: String) {
        let data = FlashCardData(context: self.container.viewContext)
        data.id = UUID()
        data.definition = definition
        data.term = term
        data.tag = tag
        data.date = date
        data.name = name
        fetchRequest()
    }

CoreData:

ios swift swiftui core-data crash
© www.soinside.com 2019 - 2024. All rights reserved.