SwiftUI Модальная среда - PullRequest
       4

SwiftUI Модальная среда

3 голосов
/ 04 октября 2019

Я не очень понимаю, как работает среда при использовании модалов. Похоже, что среда разделена для модальных представлений.

Я сделал быстрый пример, используя базовые данные и сохраняя объект в 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")
            }
        }
    }
}```

1 Ответ

0 голосов
/ 30 октября 2019

Когда вы создаете первое представление в SwiftUI , каркас генерирует для него Среда . SwiftUI использует Environment для хранения различных системных настроек, таких как цветовая схема , managedObjectContext и специфичные для приложения вещи, такие как шрифт по умолчанию. Все системные настройки и специфичные для приложения вещи за исключением наши пользовательские EnvironmentObjects являются предопределенными значениями среды ( здесь , вы можете проверить полный набор экологических ценностей). Следует помнить одну важную вещь: каждое представление наследует Environment от своего родителя .

Так что со следующей строкой кода в вашем ModalView вы получаете managedObjectContext из среды вашего ModalView, которая была унаследована от представления, которое его представляет.

@Environment(\.managedObjectContext) var managedObjectContext

Кроме того, при работе с Coredata вы должны обращать внимание на контекстыособенно если вы используете несколько контекстов.

Совет. Если вы перейдете к нашему корневому представлению и зададите все значения, которые вам могут понадобиться, вы будете распространять их по всему приложению (как значения, введенные в Environment).

Справочные материалы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...