[英]Cant' add data to core data with a sheet in SwiftUI
在下面显示的代码中,我有一个带有Group
的TrainingView
来添加数据。 这完美地工作。 控制台仅打印“已保存”,视图重新加载新数据。 我想使用模态/工作表添加相同的数据。 我创建了具有相同操作来添加数据的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.