I got this to work in a simple demo.
Scene Delegate:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let container = (UIApplication.shared.delegate as? AppDelegate)!.persistentContainer
let context = container.viewContext
if let windowScene = scene as? UIWindowScene {
let rootView = ContentView().environment(\.managedObjectContext, context)
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: rootView)
self.window = window
window.makeKeyAndVisible()
}
}
Root View:
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: fetchRequest(), animation: nil) var newsItems: FetchedResults<News>
var body: some View {
NavigationView {
List(self.newsItems, id: \.self) { newsItem in
Text(newsItem.title!)
}
.navigationBarItems(trailing:
Button(action: {
self.insertNews()
}) {
Image(systemName: "plus.circle")
}
)
}
}
func insertNews() {
let news = News(context: managedObjectContext)
news.title = "Test"
}
static func fetchRequest() -> NSFetchRequest<News> {
let request: NSFetchRequest<News> = News.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]
return request
}
}