我正在使用 CoreData 构建应用程序,在添加数据的阶段,我在运行应用程序时收到错误。以下是完整消息:主题 1:“尝试删除包含拒绝辞职的第一响应者的部分。
被要求辞职的第一响应者(从 -resignFirstResponder 返回 YES):
我想问题出在 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()
}