SwiftUI 2.0 CoreData issues with new project - 'Cannot find type 'Item' in scope'
[EDIT] I was hoping that Apple would have fixed what is obviously a bug. The solution is to clear the cache, close and reopen Xcode..
I am on Xcode Beta and starting a new project and without writing a single line of code I already get an error. I could not find anything online. Perhaps is this too new?
In the new version of Xcode I selected new Project,
then ticked the box with Core Data
If I do not tick the box I would get the usual Xcode SwiftUI template with "hello world", but ticking the Core Data box I get a ton more template code from Apple and without touching anything and without changing a single line of code, I get an error message compiling it..
The error is: "Cannot find Item in scope"
Quite frustrating, especially because all tutorials I have start with the classic 'AppDelegate' file configuration.. while the new SwiftUI is 'universal'!
I checked the file .xcdatamodeld
and it looks fine, and has the 'Item' entity. Why it doesn't compile?
So I am now at a loss, is there a solution or this is a bug and need to wait that Apple releases a fix. If so I do not need to start with a new project until then!
PS Today I cleaned the cache with CMD-ALT-SHIFT-K, closed Xcode, deleted the app from the simulator, reopened, rebuilt and it did compile.. but nothing in the simulator! We are making progress! Still I did not change a line of code. Everything is the Apple template yet!
Solution 1:
The normal Xcode clearing works for me:
-
Clean build folder (SHIFT + COMMAND + K)
-
Quit Xcode completely
-
Delete the project's contents in,
DerivedData/{Project Name}_some_hash
The default location is
~/Library/Developer/Xcode/DerivedData
, but if it's nowhere to be found, check the Derived Data property under, Xcode → Preferences → Locations -
Try again (run Xcode & build)
Solution 2:
For a brand new project, press Command+B to build and it will be fine.
Solution 3:
Firstly it's not an issue with your app but an issue with a preview. Your app works properly on the simulator. The white screen is because you need to wrap your list with NavigationView() to see add and edit button. See this answer: https://stackoverflow.com/a/66234095/15224199
After that, you will see add and edit button on the simulator. But you have to fix the preview too. It doesn't work because you have an empty entity and you need to mock it. Go to Persistance.swift and you should add similar for loop as mine to create mocked Items in preview varable:
static var preview: PersistenceController = {
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
for _ in 0..<10 {
let newItem = Item(context: viewContext)
newItem.timestamp = Date()
}
do {
try viewContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
return result
}()
At the end make sure that your preview use those mocked values:
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
After that, it should work perfectly fine, hope it helps. I don't know why Apple provides a template that doesn't work properly at the beginning.