Переменная среды не передана в Subviews - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу начать работу с Core Data и SwiftUI и поэтому создал новый проект watchOS с использованием новейшего GM Xcode 11.1.

Затем я скопировал оба persistentContainer & saveContext из свежего проекта iOS(с включенными Core Data), чтобы получить возможности Core Data.

После этого я изменил HostingController, чтобы он возвращал AnyView, и установил переменную в среде.

class HostingController: WKHostingController<AnyView> {
    override var body: AnyView {

        let managedObjectContext = (WKExtension.shared().delegate as! ExtensionDelegate).persistentContainer.viewContext


        return AnyView(ContentView().environment(\.managedObjectContext, managedObjectContext))
    }
}

СейчасЯ могу получить доступ к контексту внутри ContentView, , но не в его подэкранах .
Но разве это не так, как задумано?Насколько я знаю, все вложенные представления должны наследовать свое окружение от своих суперпредставлений, верно?

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

ContentView.swift

NavigationLink(destination: ProjectsView().environment(\.managedObjectContext, managedObjectContext)) {
    HStack {
        Image(systemName: "folder.fill")
        Text("Projects")
    }
}

Как только я удалю параметр .environment () внутри ContentView, приложение будет аварийно завершено, поскольку не загружен контекст?!

Сообщение об ошибкеContext in environment is not connected to a persistent store coordinator: <NSManagedObjectContext: 0x804795e0>.

ProjectsView.swift

struct ProjectsView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    [...]
}

Но опять же, это не может быть правильно?Итак, что является причиной ошибки здесь?

1 Ответ

1 голос
/ 26 сентября 2019

В каждом представлении, к которому вы хотите получить доступ к свойству managedObjectContext, вы должны объявить его следующим образом:

@Environment(\.managedObjectContext) var context: NSManagedObjectContext

Вы не устанавливаете его в представлениях, оно передается длявы.И не забудьте также импортировать CoreData в эти файлы.

...