无法findNSManagedObject的特定子类

我正在开发与核心数据的应用程序。 当我创build一个实例使用:

let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext) let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext) 

我在日志中得到了一个警告:

 CoreData: warning: Unable to load class named 'User' for entity 'User'. Class not found, using default NSManagedObject instead. 

我怎么解决它?

另一个问题,我怎么能在NSManagedObject子类中定义一个实例方法?

编辑:

我已经在下面的截图中指定了实体的类:

在这里输入图像描述

更新Xcode 7(final):将模块名称添加到类中(如Xcode 6和Xcode 7的早期beta版本)不再需要。 Apple文档实现核心数据pipe理对象子类已经相应更新。

数据模型检查器现在有两个字段“Class”和“Module”,用于一个实体:

在这里输入图像描述

当为实体创build一个Swift托pipe对象的子类时,“模块”字段被设置为“当前产品模块”,使用此设置创build实例既可以在主应用程序中执行,也可以在unit testing中执行。 托pipe对象子类不能@objc(classname)标记(这在https://stackoverflow.com/a/31288029/1187415中可见)。

或者,您可以清空“模块”字段(它将显示“无”),并用@objc(classname)标记托pipe对象子@objc(classname) (这在https://stackoverflow.com/a/31287260/1187415中可见)。


备注:这个答案最初是为Xcode 6编写的。关于这个问题,各种Xcode 7 beta版本发生了一些变化。 由于这是一个被接受的答案,有很多提议和链接,我试图总结当前的Xcode 7最终版本的情况。

我做了我自己的“研究”,并阅读了这个问题和类似的问题的所有答案CoreData:warning:无法加载名为 。 所以归属于所有这些,即使我没有具体列出它们!


先前的答案Xcode 6

如实现核心数据pipe理对象子类中所述 ,必须在模型实体检查器的类字段中将实体类名称作为模块名称的前缀,例如“MyFirstSwiftApp.User”。

只是一个侧面说明。 我遇到过同样的问题。 而我所要做的就是在我的类文件中添加@objc(ClassName)

例:

 @objc(Person) class Person { } 

这解决了我的问题。

这个问题被接受的答案帮助我解决了同样的问题,但我有一个警告,我认为会对别人有所帮助。 如果您的项目(模块)名称中有空格,则必须用下划线replace空格。 例如:

实体:MyEntity类:My_App_Name.MyClass

记得要删除你的模块

在这里输入图像描述

取决于如果你运行的应用程序与testing问题可能是该应用程序正在寻找<appName>.<entityName> ,当它运行testing它看起来像<appName>Tests.<entityName> 。 我现在使用的解决scheme(Xcode 6.1)不是在CoreData UI中填充Class字段,而是在代码中完成。

此代码将检测您是否正在运行应用程序vstesting并使用正确的模块名称并更新managedObjectClassName

 lazy var managedObjectModel: NSManagedObjectModel = { // The managed object model for the application. This property is not optional... let modelURL = NSBundle.mainBundle().URLForResource("Streak", withExtension: "momd")! let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)! // Check if we are running as test or not let environment = NSProcessInfo.processInfo().environment as [String : AnyObject] let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest" // Create the module name let moduleName = (isTest) ? "StreakTests" : "Streak" // Create a new managed object model with updated entity class names var newEntities = [] as [NSEntityDescription] for (_, entity) in enumerate(managedObjectModel.entities) { let newEntity = entity.copy() as NSEntityDescription newEntity.managedObjectClassName = "\(moduleName).\(entity.name)" newEntities.append(newEntity) } let newManagedObjectModel = NSManagedObjectModel() newManagedObjectModel.entities = newEntities return newManagedObjectModel }() 

如果您在项目名称中使用连字符(如“我的应用程序”),则使用下划线而不是连字符(如“My_App.MyManagedObject”)。 通常,查看xcdatamodeld文件的名称,并使用与该名称相同的前缀。 即“My_App_1.xcdatamodeld”需要前缀“My_App_1”

这可以帮助那些遇到同样问题的人。 我是用Swift 2和Xcode 7 beta 2。

在我的情况下,解决scheme是在EntityName.swift注释@objc(EntityName)

我有同样的警告,虽然我的应用程序似乎运行良好。 问题是,在最后一个屏幕上运行编辑器>创buildNSManagedObject子类时,我使用了默认的组位置,没有显示或检查目标,它们将子类保存在MyApp.xcodeproj所在的顶部MyApp目录中。
当我将组更改为MyApp子文件夹并检查了MyApp目标时,警告消失了。

顺便说一句,你添加为前缀:我的应用程序被称为“ABC-def”和Xcode已将“ – ”转换为“_”。

为了安全查找发现者,find你的项目文件,看看它为你的数据模型(例如“ABC_def.xcdatamodeld”),并使用什么写在那里!

上面的答案是有帮助的。 这个快速的完整性检查可以为您节省一些时间。 进入“项目”>“构build阶段”>“编译源代码”,使用“ – ”button删除xcdatamodeld和模型文件,然后使用“+”button直接添加它们。 重build – 可能会照顾它。

上面的答案帮助我解决了与Objective-C有关的不同问题(也许它会帮助某人):

如果您重构实体名称,不要忘记更改“实用工具面板”中的“类”。

上面的答案帮助了我,但这可能有助于某人。 如果像我一样,你做了他们,仍然有问题,记得干脆“清理你的项目”。 对于XCode8,产品>清洁。 然后再次运行。

在Xcode 7中,实体和类名可以相同,但Codegen应该是类定义。 在这种情况下,将不会有任何警告等