Гра з SwiftUI та Core Data викликала у мене цікаву проблему. Тож ситуація така:
У мене головний вигляд "AppView" та підвид з назвою "SubView". Перегляд SubView відкриється з подання AppView, якщо я натискаю кнопку "плюс" в NavigationTitleBar як поповер або аркуш.
@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", спеціально: "Невирішена помилка. Помилка помилки = 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 () таким чином, представлення не є частиною ієрархії перегляду? Я цього не розумію ...