Ios 找不到NSManagedObject的特定子类

Ios 找不到NSManagedObject的特定子类,ios,core-data,swift,nsmanagedobject,Ios,Core Data,Swift,Nsmanagedobject,我正在开发一个包含核心数据的应用程序。当我使用以下命令创建实例时: let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext) let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext) 我在日志

我正在开发一个包含核心数据的应用程序。当我使用以下命令创建实例时:

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的更新(最终版): 不再需要在类前面加上模块名(如Xcode 6和Xcode 7的早期beta版)。 苹果的文档已经发布 相应更新

数据模型检查器 现在,实体有两个字段“类”和“模块”:

为实体创建Swift托管对象子类时 “模块”字段设置为“当前产品模块”,并使用此设置 创建实例在主应用程序和单元测试中都有效。 托管对象子类不得标记为
@objc(classname)
(在中观察到)

或者,您可以清空“模块”字段(它将显示“无”)并标记 具有
@objc(classname)
的托管对象子类(观察到这一点 中)


备注:此答案最初是为Xcode 6编写的。 在各种Xcode 7 beta版本中有一些变化 关于这个问题。因为这是一个被许多人接受的答案 通过投票和链接,我试图总结一下情况 对于当前的Xcode 7最终版本

我自己做了“研究”,并阅读了这个问题和类似问题的所有答案 . 因此,归属属于所有人,即使我没有 具体列出它们


先前对Xcode 6的回答是:

如中所述,您必须
在模型实体检查器的类字段中,在实体类名称前面加上模块名称,例如“MyFirstSwiftApp.User”。

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

实体:MyEntity
类:My_App_Name.MyClass

作为旁注。我也有同样的问题。我所要做的就是在我的类文件中添加
@objc(ClassName)

例如:

@objc(Person)
class Person { }

这就解决了我的问题。

取决于你是作为应用程序运行还是作为测试运行,问题可能是应用程序正在查找
,而当它作为测试运行时,它看起来是作为
测试运行。
。我现在使用的解决方案(Xcode 6.1)是不填充CoreData UI中的
字段,而是在代码中完成

此代码将检测您是否作为应用程序vs测试运行,并使用正确的模块名称并更新
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”,则使用下划线,而不是连字符,如“My_App.MyManagedObject”。 通常,查看xcdatamodeld文件的名称,并使用与该名称相同的前缀。
例如,“My_App_1.xcdatamodeld”需要前缀“My_App_1”

以上答案非常有用。这种快速的健康检查可能会为您节省一些时间。进入项目>构建阶段>编译源代码,用“-”按钮删除xcdatamodeld和模型文件,然后用“+”按钮将它们添加回来。重建——这可能会解决问题。

上述答案帮助我解决了与Objective-C相关的不同问题(可能会帮助某人):


如果重构了实体名称,也不要忘记更改“实用程序面板”中的“类”。

我收到了相同的警告,尽管我的应用程序运行正常。 问题是,在上一个屏幕上运行编辑器>创建NSManagedObject子类时,我使用了默认的组位置,没有显示或选中目标,这将子类保存在MyApp.xcodeproj所在的MyApp顶级目录中。

当我将组改为MyApp子文件夹并检查MyApp目标时,警告消失了。

顺便说一句,请小心添加前缀:我的应用程序名为“ABC def”,Xcode已将“-”转换为“\ux”


为了安全起见,请查看finder,找到您的项目文件并查看它对您的数据模型的说明(例如“ABC_def.xcdatamodeld”),并使用其中所写的内容

请记住卸下您的模块


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


在我的例子中,是在
EntityName.swift
中注释掉
@objc(EntityName)
,上面的答案对我有帮助,但这可能对某些人有帮助。如果你像我一样做了,但仍然有问题,记得简单地“清理你的项目”。对于XCode8,产品>清洁。然后再次运行。

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


是否如中所述,在实体类名前加上模块名?@MartinR:请参阅我的问题更新。该类应为“YourAppName.User”,请参阅文档(我之前评论中的链接)。@MartinR:感谢您的帮助。最好的办法是删除这些类并重新创建。这对我来说是有效的。你用这种方式在Objective-C中定义了typealias(.Person->Person),所以它是有效的。似乎苹果忘了将它完全转换成swift。。我不知道为什么,但这对我来说是相当温和的。如果你有一个有多个目标的项目,其中每个目标共享CoreData模型,这是非常有用的。在这些情况下,不可能在类名前面加上目标标识符的类名,因为这使得CD模型只对其中一个目标有用。@djbp和“为什么不?”我想知道。我喜欢名称空间的概念,但这让我想把我的MacBook扔出窗外(我有一个ap)