繁体   English   中英

无法使用 SwiftUI 中的表格将数据添加到核心数据

[英]Cant' add data to core data with a sheet in SwiftUI

在下面显示的代码中,我有一个带有GroupTrainingView来添加数据。 这完美地工作。 控制台仅打印“已保存”,视图重新加载新数据。 我想使用模态/工作表添加相同的数据。 我创建了具有相同操作来添加数据的NewTrainingView ,但它不起作用。 控制台打印已保存错误:nilError。

struct TrainingView: View {

    @State var showAdd = false
    @State var newTrainingName: String = ""

    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Training.name, ascending: true)]) var trainings: FetchedResults<Training>
    @Environment(\.managedObjectContext) var viewContext
    @Environment(\.presentationMode) var presentationMode

    var body: some View {

        NavigationView {
            VStack {
                Group {
                    VStack {
                        TextField("Name", text: $newTrainingName)
                            .padding()
                            .background(Color.white)
                            .cornerRadius(15)
                        Button(action: {
                            //THIS IS WORKING
                            let training = Training(context: self.viewContext)
                            training.name = self.newTrainingName
                            do {
                                print("saved")
                                try self.viewContext.save()
                            } catch let error {
                                print("Error: \(error)")
                            }
                        }) {
                            Text("Add")
                                .padding()
                        }
                    }
                    .padding()
                    .background(Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)))
                    .cornerRadius(15)
                }
                .padding()
                List {
                    ForEach(trainings, id: \.self) { training in
                        NavigationLink(destination: WorkoutView(training: training)) {
                            Text(training.name!)
                        }
                    }.onDelete(perform: deleteRow)
                }
            }
            .navigationBarTitle(Text("Trainings"))
            .navigationBarItems(
                trailing:
                    Button(action: {
                        self.showAdd.toggle()
                    }) {
                        Image(systemName: "plus")
                    }
                )
            .sheet(isPresented: $showAdd) {
                NewTrainingView()
            }
        }
    }

    func deleteRow(at indexSet: IndexSet) {
        for index in indexSet {
            let training = trainings[index]
            viewContext.delete(training)
            do {
                try viewContext.save()
            } catch let error {
                print("Error: \(error)")
            }
        }
    }
}

struct NewTrainingView: View {

    @Environment(\.presentationMode) var presentationMode
    @Environment(\.managedObjectContext) var viewContext

    @State var newTrainingText: String = ""

    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Gib deinem Plan einen Namen:")){
                    TextField("Name", text: $newTrainingText)
                }
                Button(action: {
                    if (self.newTrainingText != "") {
                        //THIS IS NOT WORKING
                        let training = Training(context: self.viewContext)
                        training.name = self.newTrainingText
                        do {
                            print("saved")
                            try self.viewContext.save()
                        } catch let error {
                            print("Error: \(error)")
                        }
                        self.presentationMode.wrappedValue.dismiss()
                    }
                }) {
                    Text("Hinzufügen")
                }
            }
            .navigationBarTitle(Text("Neuer Trainingsplan"))
            .navigationBarItems(leading: Button(action: {
                 self.presentationMode.wrappedValue.dismiss()
            }) {
                Text("Zurück")
            })
        }
    }
}

看起来您需要将托管 object 上下文传递给您的NewTrainingView

.sheet(isPresented: $showAdd) {
    NewTrainingView()
        .environment(\.managedObjectContext, self.viewContext)    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM