Michel
Michel

Reputation: 11753

Problem saving data, using CoreData with SwiftUI

I just started using CoreData with SwiftUI. After following this series of tutorial. And I am facing a situation where I cannot save data as I expect. Here is the relevant code:

struct MyView: View {
    ......
    @Environment(\.managedObjectContext) var managedObjectContext
    
    func setData() {
        print(#function)
        .....
        let myData = SomeEntity(context: self.managedObjectContext)
        myData.name = "myName"
        myData......
        
        do {
            try self.managedObjectContext.save()
        } catch let error {
            // Handle the Core Data error.
            print("Can't save as expected!!!!")
            print("Error : \(error)")
        }
    }
    
    .....

    var body: some View {
        ........
    }
}

When this code executes I get this error:

Can't save as expected!!!!
Error : nilError

Can somebody tell me what I need to check?

I am all the more puzzled, that I have another part in my app (apparently similar), in a view one level above, where the saving is perfectly working.

In case this may be useful, the view is presented with code like this:

}).sheet(isPresented: $showingFlag) {
    MyView(.....)
}

In the presenting view, data saving is working.

Upvotes: 0

Views: 639

Answers (1)

Magnas
Magnas

Reputation: 4054

Sheets and alerts, etc are modal views. Modal views are normal views, but they are not part of the interface's view hierarchy and are presented on top of the rest of the views on the screen. This means they do not have automatic access to the same @Environment variables that were injected into the interface's view hierarchy (usually in the SceneDelegate or the newer SwiftUI App life-cycle).

To access that same managedObjectContext variable inside the modal View you can pass it along using standard dependency injection.

    }).sheet(isPresented: $showingFlag) {
    MyView(context: managedObjectContext)
}


struct MyView: View {
    ......
    var context: NSManagedObectContext!
    
    func setData() {
        print(#function)

Upvotes: 2

Related Questions