Не удается сохранить основные данные из SwiftUI - PullRequest
0 голосов
/ 01 октября 2019

Я работаю над приложением, в котором базовые данные сочетаются с SwiftUI. Все шло хорошо, пока я не поместил свой код обновления в лист, после этого я получил ошибку «Foundation._GenericObjCError», равную 0, которая, по моему мнению, означает отсутствие ошибки, но мой постоянный контейнер все еще не обновился.

эта комбинация известная проблема?

Код, который я использую для добавления записей в мою запись в Магазине:

struct StoreAdd: View {
    @Environment(\.managedObjectContext)
    var managedObjectContext

    @State
    var name = ""
    @State
    var branch = ""

    var body: some View {
        VStack {
            TextField("Store name", text: $name)
            TextField("Store branch", text: $branch)
            Button(
                action: {
                    let store = Store(context: self.managedObjectContext)
                    store.id = UUID()
                    store.name = self.name
                    store.branch = self.branch.isEmpty ? nil : self.branch
                    self.managedObjectContext.persist()
                },
                label: { Text("Add")}
            )
            .disabled(name.isEmpty)
        }
        .padding(.horizontal, 20)
    }
}

persist() - это обертка вокруг save().

Ответы [ 2 ]

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

Я тоже столкнулся с этой проблемой. Я ошибочно полагал, что переменные @Environment находятся в каком-то глобальном магазине или, по крайней мере, в магазине, уникальном для каждого SceneDelegate.

Однако кажется, что Environment является иерархическим, автоматически передается его потомкам и не передается модам. Я предполагаю, что в вашем случае вы использовали что-то вроде .sheet, чтобы открыть представление StoreAdd. Это фактически заставляет StoreAdd получить полностью пустую среду. Я обнаружил, что могу решить эту ошибку, выполнив что-то вроде этого:

.sheet(isPresented: $showAddSheet, content: { StoreAdd().environment(\.managedObjectContext, self.managedObjectContext) } )

Я не знаю, является ли это ошибкой или умышленно. Он допускает некоторые интересные идеи, такие как передача во временный дочерний контекст для правок.

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

Я обнаружил, что проблема была в объявлении managedObjectContext. Извлечение его из среды не сработало, но передача его в качестве параметра сработает, даже если он извлекается из родительского представления из среды.

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