iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类
Posted
技术标签:
【中文标题】iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类【英文标题】:iOS 14 Beta - Core Data in Swift UI Error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 【发布时间】:2020-07-11 17:27:22 【问题描述】:我正在使用新的 SwiftUI App 协议并通过 @Environment 传递我的核心数据 NSPersistentContainer:
final class PersistentStore: ObservableObject
static let shared = PersistentStore()
let persistentContainer: NSPersistentContainer
private init()
self.persistentContainer =
let container = NSPersistentContainer(name: "SillyModel")
container.loadPersistentStores(completionHandler: (storeDescription, error) in
if let error = error as NSError?
fatalError("Unresolved error \(error), \(error.userInfo)")
)
return container
()
func saveContext()
let context = persistentContainer.viewContext
if context.hasChanges
do
try context.save()
catch
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
@main
struct SillyApp: App
@Environment(\.scenePhase) private var scenePhase
var body: some Scene
WindowGroup
NavigationView
ProjectGridView()
.environment(\.managedObjectContext, PersistentStore.shared.persistentContainer.viewContext)
然后我在 ProjectGridView 中使用 @Enviroment 从环境中获取 managedObjectContect,尝试 @FetchRequest 并显示一个新的 LazyVGrid:
struct ProjectGridView: View
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
entity: Project.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \Project.title, ascending: true)
]
) var projects: FetchedResults<Project>
let columns = [GridItem(.adaptive(minimum: 80.0))]
var body: some View
return ScrollView
LazyVGrid(columns: columns, spacing: 20)
ForEach(projects, id:\.title) (project: Project) in
Text("\(project.title ?? "")")
.padding(.horizontal)
我收到此错误:
[error] error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'Project' so +entity is confused. Have you loaded your NSManagedObjectModel yet ?
我尝试编写代码来保存新的 Project(),甚至让 @FetchRequest 在其他地方工作。我猜这可能与 LazyVGrid 的“懒惰”部分有关?有什么想法吗?
【问题讨论】:
它不是 LazyVGrid 的 Lazy 部分。我尝试将实际视图更改为普通的 VStack,甚至没有尝试读取结果,但我仍然收到错误。 【参考方案1】:好的,从 Apple 开发者论坛找到了一个修复程序。这似乎只是一个测试版错误:
要修复,请为您的模型类创建一个扩展:
import Foundation
import CoreData
extension Project
class func swiftUIFetchRequest() -> NSFetchRequest<Project>
let request = NSFetchRequest<Project>(entityName: "Project")
request.sortDescriptors = [NSSortDescriptor(keyPath: \Project.title, ascending: true)] /* You can add custom sort descriptors here */
return request
然后像这样调用@FetchRequest:
@FetchRequest(fetchRequest: Project.swiftUIFetchRequest()) var projects: FetchedResults<Project>
感谢 Apple 开发者论坛中发现这一点的人。
【讨论】:
这似乎已在 Beta 2 中得到修复。不过感谢您提供的这一点 - 当您学习时,很难知道是您搞砸了还是有这样的错误!以上是关于iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类的主要内容,如果未能解决你的问题,请参考以下文章
iOS 14.2 Beta - AVPlayer 无法播放 [关闭]
iOS 14,Swift UI 2 更改 NavigationLink 内选定列表项的背景颜色
iOS 8 中的 Facebook SDK 与 Swift/Xcode beta 5 返回 accessToken 但更新后没有用户 ID