0

In a UIKit-based app where I'm integrating SwiftUI:

class SwiftDataManager {
    static let shared = SwiftDataManager()
    private init() {}

    var container: ModelContainer?

    func initializeContainer() {
        
        do {
            container = try ModelContainer(for: Cat.self, Dog.self)
            
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
        
    }
}

struct SomeView: View {
    @Environment(\.modelContext) var modelContext
    ...
    //list cats and dogs
}

let vc = UIHostingController(rootView: SomeView().environmentObject(SwiftDataManager.shared.container?.mainContext))
vc.modalPresentationStyle = .fullScreen
present(vc, animated: true, completion: nil)

Error on the environmentObject line:

Instance method 'environmentObject' requires that 'ModelContext' conform to 'ObservableObject'

How do I get the modelContext into SomeView so that I can work with the objects saved in SwiftData?

1 Answer 1

1

Notice how you read the model context in a SwiftUI view:

@Environment(\.modelContext) var modelContext

You use the overload of @Environment that takes an EnvironmentValues key path. You do not use @EnvironmentObject to access the model context, do you?

So in the same way, you use the .environment modifier that takes an EnvironmentValues key path to set the model context.

UIHostingController(rootView: Group {
    if let container = SwiftDataManager.shared.container {
        SomeView().environment(\.modelContext, container.mainContext)
    }
    // else { SomeView() } perhaps?
})

I'm not sure why your container here is optional. You should decide what to do when it is nil.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.