Я не очень понимаю, как работает среда при использовании модалов. Похоже, что среда разделена для модальных представлений.
Я сделал быстрый пример, используя базовые данные и сохраняя объект в Core Data. Если я не передам среду, то объект не будет сохранен, и я получаю следующую ошибку при попытке сохранить объект: Операция не может быть завершена. (Foundation._GenericObjCError error 0.)
Если я передаю контекст управляемого объекта в модальной среде, он работает. Я закомментировал строку, которая заставляет его работать.
Кто-нибудь может объяснить, почему это происходит, пожалуйста?
@FetchRequest(fetchRequest: ToDoItem.fetchAllItems()) var items
@Environment(\.managedObjectContext) var managedObjectContext
@State var showAddModal = false
var body: some View {
VStack {
List(items, id: \.name) { item in
Text(item.name)
}
Button(action: {
self.showAddModal.toggle()
}) {
Text("Add item")
}.sheet(isPresented: $showAddModal) {
ModalView()
// .environment(\.managedObjectContext, self.managedObjectContext)
// It works if the managed object context is passed in the modal's environment
}
}
}
}
struct ModalView: View {
@State var toDoItemName: String = ""
@Environment(\.presentationMode) var presentationMode
@Environment(\.managedObjectContext) var managedObjectContext
var body: some View {
VStack {
TextField("Item name", text: $toDoItemName)
Button(action: {
let toDoItem = ToDoItem(context: self.managedObjectContext)
toDoItem.name = self.toDoItemName
do {
try self.managedObjectContext.save()
} catch {
print(error.localizedDescription)
}
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Add")
}
}
}
}```