Playin 'กับ SwiftUI และ Core Data ทำให้ฉันมีปัญหาแปลก ๆ ดังนั้นสถานการณ์ดังต่อไปนี้:
ฉันมีมุมมองหลัก "AppView" และมุมมองย่อยที่ชื่อว่า "SubView" มุมมอง SubView จะถูกเปิดจากมุมมอง AppView ถ้าฉันคลิกปุ่มบวกใน NavigationTitleBar ในฐานะ popover หรือชีต
@Environment(\.managedObjectContext) var managedObjectContext
@State private var modal: Bool = false
...
Button(action: {
self.modal.toggle()
}) {
Image(systemName: "plus")
}.popover(isPresented: self.$modal){
SubView()
}
มุมมอง SubView มีรูปแบบเล็ก ๆ ที่มีวัตถุ TextField สองรายการเพื่อเพิ่มชื่อและนามสกุล อินพุตของวัตถุทั้งสองนี้ได้รับการจัดการโดยคุณสมบัติ @State แยกกันสองตัว วัตถุที่สามในแบบฟอร์มนี้คือปุ่มง่าย ๆ ซึ่งควรบันทึกชื่อและนามสกุลไว้ในเอนทิตีลูกค้าที่แนบมาสำหรับ CoreData
...
@Environment(\.managedObjectContext) var managedObjectContext
...
Button(action: {
let customerItem = Customer(context: self.managedObjectContext)
customerItem.foreName = self.forename
customerItem.surname = self.surname
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}) {
Text("Speichern")
}
ถ้าฉันพยายามบันทึกเอนทิตีของลูกค้าด้วยวิธีนี้ฉันจะได้รับข้อผิดพลาด: "nilError" โดยเฉพาะ: "ข้อผิดพลาดที่ยังไม่ได้แก้ไขข้อผิดพลาด Domain = Foundation._GenericObjCError Code = 0" (null) ", [:]" จาก NSError
แต่หลังจากที่คิดออกว่าเมื่อฉันเพิ่มลง.environment(\.managedObjectContext, context)
ใน SubView () โทรเช่นนั้นSubView().environment(\.managedObjectContext, context)
มันทำงานเหมือนมีเสน่ห์
ไม่มีใครรู้ว่าทำไมฉันต้องผ่านการจัดการ ObjectContext เป็นครั้งที่สอง? ฉันคิดว่าฉันต้องผ่านการจัดการ ObjectContext หนึ่งครั้งเพื่อใช้ในลำดับชั้นของมุมมองทั้งหมดเช่นเดียวกับใน SceneDelegate.swift:
// Get the managed object context from the shared persistent container.
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
// Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath.
// Add `@Environment(\.managedObjectContext)` in the views that will need the context.
let contentView = AppView().environment(\.managedObjectContext, context)
เป็นเพราะการเรียก SubView () ด้วยวิธีนี้มุมมองไม่ได้เป็นส่วนหนึ่งของลำดับชั้นมุมมองหรือไม่ ฉันไม่เข้าใจมัน ...