स्विफ्टयूआई और कोर डेटा के साथ प्लेइन ने मुझे एक जिज्ञासु समस्या में ला दिया। तो स्थिति निम्नलिखित है:
मेरे पास एक मुख्य दृश्य "AppView" और "SubView" नाम का एक उप दृश्य है। यदि मैं नेविगेशनटाइटिलार में पॉपओवर या शीट के रूप में प्लस बटन पर क्लिक करता हूं तो सब व्यू व्यू एप व्यू से खोला जाएगा।
@Environment(\.managedObjectContext) var managedObjectContext
@State private var modal: Bool = false
...
Button(action: {
self.modal.toggle()
}) {
Image(systemName: "plus")
}.popover(isPresented: self.$modal){
SubView()
}
SubView दृश्य में दो टेक्स्टफिल्ड ऑब्जेक्ट्स के साथ एक छोटा रूप है, जिसमें एक नाम और एक उपनाम जोड़ना है। इस दो वस्तुओं के इनपुट को दो अलग-अलग @State गुणों द्वारा नियंत्रित किया जाता है। इस रूप में तीसरी वस्तु सरल बटन है, जो कोरडाटा के लिए एक संलग्न ग्राहक इकाई के लिए पहले और उपनाम को बचाना चाहिए।
...
@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", विशेष रूप से: "अनरसेल्ड एरर एरर डोमेन = Foundation._GenericObjCError कोड = 0" (null) ", [:]" NSError से।
लेकिन यह पता लगाने के बाद, कि जब मैं .environment(\.managedObjectContext, context)
SubView () कॉल में जोड़ता हूं तो SubView().environment(\.managedObjectContext, context)
यह एक आकर्षण की तरह काम करता है।
क्या किसी को पता है, मुझे दूसरी बार ManageObjectContext पास करने की आवश्यकता क्यों है? मैंने सोचा, कि मुझे पूरे दृश्य पदानुक्रम में इसका उपयोग करने के लिए एक बार ManageObjectContext पास करना होगा, जैसे 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)
क्या ऐसा इसलिए है क्योंकि सबव्यू () को इस तरह से कॉल करना, दृश्य व्यू पदानुक्रम का हिस्सा नहीं है? मुझे यह समझ में नहीं आता ...