CoreData和SwiftUI:环境中的上下文未连接到持久性存储协调器

我正在尝试通过构建一个作业管理应用程序来自学核心数据。我的代码构建良好,并且该应用程序可以正常运行,直到我尝试向列表中添加新任务。我Thread 1:

EXC_BREAKPOINT (code=1, subcode=0x1c25719e8)在以下行中收到此错误:ForEach(courses, id:

\.self) { course in。控制台也有此错误:Context in environment is not connected to a

persistent store coordinator: <NSManagedObjectContext: 0x2823cb3a0>

我对Core

Data知之甚少,对可能的问题不知所措。我已经在数据模型中设置了“分配”和“课程”实体,其中Course与“分配”具有一对多关系。每个作业将根据特定课程进行分类。

这是用于向列表添加新分配的视图的代码:

    struct NewAssignmentView: View {

@Environment(\.presentationMode) var presentationMode

@Environment(\.managedObjectContext) var moc

@FetchRequest(entity: Course.entity(), sortDescriptors: []) var courses: FetchedResults<Course>

@State var name = ""

@State var hasDueDate = false

@State var dueDate = Date()

@State var course = Course()

var body: some View {

NavigationView {

Form {

TextField("Assignment Name", text: $name)

Section {

Picker("Course", selection: $course) {

ForEach(courses, id: \.self) { course in

Text("\(course.name ?? "")").foregroundColor(course.color)

}

}

}

Section {

Toggle(isOn: $hasDueDate.animation()) {

Text("Due Date")

}

if hasDueDate {

DatePicker(selection: $dueDate, displayedComponents: .date, label: { Text("Set Date:") })

}

}

}

.navigationBarTitle("New Assignment", displayMode: .inline)

.navigationBarItems(leading: Button(action: {

self.presentationMode.wrappedValue.dismiss()

}, label: { Text("Cancel") }),

trailing: Button(action: {

let newAssignment = Assignment(context: self.moc)

newAssignment.name = self.name

newAssignment.hasDueDate = self.hasDueDate

newAssignment.dueDate = self.dueDate

newAssignment.statusString = Status.incomplete.rawValue

newAssignment.course = self.course

self.presentationMode.wrappedValue.dismiss()

}, label: { Text("Add").bold() }))

}

}

}

编辑:这是AppDelegate中设置持久性容器的代码:

lazy var persistentContainer: NSPersistentCloudKitContainer = {

let container = NSPersistentCloudKitContainer(name: "test")

container.loadPersistentStores(completionHandler: { (storeDescription, error) in

if let error = error as NSError? {

fatalError("Unresolved error \(error), \(error.userInfo)")

}

})

return container

}()

还有SceneDelegate中设置环境的代码:

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.

// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.

// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

// 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 = ContentView().environment(\.managedObjectContext, context)

// Use a UIHostingController as window root view controller.

if let windowScene = scene as? UIWindowScene {

let window = UIWindow(windowScene: windowScene)

window.rootViewController = UIHostingController(rootView: contentView)

self.window = window

window.makeKeyAndVisible()

}

}

回答:

像moc这样的环境值仅自动传递到层次结构中的其他视图。因此,如果您显示工作表或不属于视图层次结构的任何内容,则将失去环境,并且需要像向ContentView一样将moc传递给新层次结构。检查以下代码段:

.sheet(isPresented: self.$showSheet) {

SheetView()

.environment(\.managedObjectContext, self.moc)

}

以上是 CoreData和SwiftUI:环境中的上下文未连接到持久性存储协调器 的全部内容, 来源链接: utcz.com/qa/401695.html

回到顶部