SwiftUI ve Core Data ile oynamak beni meraklı bir soruna getirdi. Durum şu şekildedir:
Ana görünümü "AppView" ve "SubView" adlı bir alt görünümü var. NavigationTitleBar'daki artı düğmesini popover veya sayfa olarak tıklarsam SubView görünümü AppView görünümünden açılır.
@Environment(\.managedObjectContext) var managedObjectContext
@State private var modal: Bool = false
...
Button(action: {
self.modal.toggle()
}) {
Image(systemName: "plus")
}.popover(isPresented: self.$modal){
SubView()
}
SubView görünümünde bir ad ve soyadı eklemek için iki TextField nesnesi içeren küçük bir form vardır. Bu iki nesnenin girdileri iki ayrı @State özelliği tarafından işlenir. Bu formdaki üçüncü nesne, CoreData için ekli bir Müşteri Varlığına bir ön ve soyadı kaydetmesi gereken basit düğmedir.
...
@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")
}
Müşteri varlığını bu şekilde kaydetmeye çalışırsam, şu hatayı alıyorum: "nilError", özellikle: "Çözülemeyen hata Hata Domain = Foundation._GenericObjCError Code = 0" (null) ", [:]" NSError'dan.
Ama anladıktan sonra .environment(\.managedObjectContext, context)
, SubView () çağrısına eklediğimde SubView().environment(\.managedObjectContext, context)
bir cazibe gibi çalışır.
Herkes bilen, neden manageObjectContext ikinci kez geçmek gerekir? SceneDelegate.swift gibi tüm görünüm hiyerarşisinde kullanmak için bir kez yönetilenObjectContext geçirmeniz gerektiğini düşündüm:
// 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 () bu şekilde çağrıldığında görünüm görünüm hiyerarşisinin bir parçası değil mi? Anlamıyorum ...