Swift主导项目无顶层SwiftUI视图时,如何在SwiftUI视图用Core Data?
在非纯SwiftUI的Swift项目中为SwiftUI视图设置Core Data MOC的方法
不用必须嵌套顶层SwiftUI视图,有两种直接可行的方式为单个SwiftUI视图配置托管对象上下文(MOC):
直接将MOC作为参数传入SwiftUI视图
跳过环境变量依赖,在初始化视图时直接传入MOC,视图内部可直接使用该实例操作Core Data。示例代码:// 定义你的SwiftUI视图 struct DataDisplayView: View { private let moc: NSManagedObjectContext init(moc: NSManagedObjectContext) { self.moc = moc } var body: some View { List { // 直接传入moc创建FetchRequest ForEach(FetchRequest<TodoItem>(managedObjectContext: moc)) { item in Text(item.title ?? "Untitled") } } } } // 在UIKit代码中初始化并集成视图 let appMOC = DataController.shared.container.viewContext let swiftUIView = DataDisplayView(moc: appMOC) let hostingController = UIHostingController(rootView: swiftUIView) // 将hostingController添加到你的UIKit视图层级(比如导航栈) self.navigationController?.pushViewController(hostingController, animated: true)手动为单个视图注入环境变量
如果你偏好使用@Environment获取MOC,可以在初始化SwiftUI视图后,通过.environment()修饰符单独注入MOC,无需顶层WindowGroup配置。示例:let targetMOC = DataController.shared.container.viewContext let contentView = TodoListView() .environment(\.managedObjectContext, targetMOC) let hostingController = UIHostingController(rootView: contentView) // 后续将hostingController添加到UIKit视图体系中此时在
TodoListView内部,就能直接通过@Environment(\.managedObjectContext) private var moc获取并使用MOC。
内容的提问来源于stack exchange,提问作者bcl
相关产品推荐
相关产品推荐

