1

Here's my project:

struct Project: App {
  @StateObject private var dataController = DataController()
  @FetchRequest(sortDescriptors: []) var students: FetchedResults<Student>
  var body: some Scene {
    MainScene()
    Settings { Text("Setting") }
    MenuBarExtra("Menu", systemImage: "swift") {
      List(students) { student in
        Text(student.name ?? "Unknown")
      }
      Divider()
      Button("Add") {
        let id = UUID()
        let name = "Foo"
        let context = dataController.container.viewContext
        let student = Student(context: context)
        student.id = id
        student.name = name
        try? context.save()
      }
    }
  }
}

I am new to use CoreData, in this tutorial he passed the viewContext to enviroment managedObjectContext, so in the ContentView he can use it directly by calling @Environment(\.managedObjectContext) var moc.

But in the MenuBarExtra, there's no place to inject this enviroment values, even if I call it directly (let context = dataController.container.viewContext) the compiler give me warnnings:

Context in environment is not connected to a persistent store coordinator.

So I don't know how to use it in my example.

FaiChou
  • 767
  • 7
  • 16

1 Answers1

0

I found another workaround: create a new view, and combine with the MenuBarExtra:

struct Project: App {
  @StateObject private var dataController = DataController()
  var body: some Scene {
    MainScene()
    Settings { Text("Setting") }
    MenuBarExtra("Menu", systemImage: "swift") {
      StudentList().enviroment(\.manag....)
    }
  }
}

struct StudentList: View {
  @FetchRequest(sortDescriptors: []) var students: FetchedResults<Student>
  @Environment(\.managedObjectContext) var context
  var body: some View {
      List(students) { student in
        Text(student.name ?? "Unknown")
      }
      Divider()
      Button("Add") {
        let id = UUID()
        let name = "Foo"
        let context = dataController.container.viewContext
        let student = Student(context: context)
        student.id = id
        student.name = name
        try? context.save()
      }
  }
}
FaiChou
  • 767
  • 7
  • 16