无法找到NSManagedObject的特定子类

Msr*_*fly 131 core-data nsmanagedobject ios swift

我正在开发一个使用Core Data的应用程序.当我使用以下方法创建实例时:

let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)
Run Code Online (Sandbox Code Playgroud)

我在日志中收到警告:

CoreData: warning: Unable to load class named 'User' for entity 'User'.  Class not found, using default NSManagedObject instead.
Run Code Online (Sandbox Code Playgroud)

我该怎么办呢?

另一个问题是,如何在NSManagedObject子类中定义实例方法?

编辑:

我已经指定了实体的类,如下面的屏幕截图所示:

在此输入图像描述

Mar*_*n R 217

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

数据模型检查器现在有一个实体的两个字段"Class"和"Module":

在此输入图像描述

为实体创建Swift托管对象子类时,"模块"字段将设置为"当前产品模块",使用此设置,创建实例可在主应用程序和单元测试中运行.不得标记托管对象子类@objc(classname)(这在/sf/answers/2190162061/中观察到).

或者,您可以清空"模块"字段(它将显示"无")并标记托管对象子类@objc(classname)(这在/sf/answers/2190108231/中观察到).


备注:这个答案最初是为Xcode 6编写的.对于这个问题,各种Xcode 7 beta版本都有一些变化.由于它是许多upvotes和链接的公认答案,我试图总结当前Xcode 7最终版本的情况.

我做了我自己的"研究"并阅读了这个问题和类似问题CoreData的所有答案 :警告:无法加载命名的类.因此即使我没有具体列出它们,归属也归于所有这些!


Xcode 6的上一个答案:

实现核心数据管理对象子类中所述,您必须在模型实体检查器的"类"字段中使用模块的名称为实体类名添加前缀,例如"MyFirstSwiftApp.User".

  • @Allan:您可以尝试在Christer的回答中提出的`@objc(ClassName)`方法. (9认同)
  • 它可以工作,但是一旦我在实体检查器中将类名设置为"APPNAME.User",我就无法重新生成模型类:Xcode似乎被前缀混淆了,它生成了一个带有名称的文件/类APPNAME.我错过了什么吗? (8认同)
  • @Pascal:我认为是Xcode中的一个错误. (8认同)
  • 这个适合我.问题:如果核心数据包含在框架中,如何为ManagedObject子类名称添加前缀,因为还没有实际的应用程序呢? (2认同)

Chr*_*ter 60

就像一个旁注.我遇到过同样的问题.而我所要做的就是添加@objc(ClassName)我的类文件.

例:

@objc(Person)
class Person { }
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.

  • 如果您的项目具有多个目标,其中每个目标共享CoreData模型,则此功能尤其有用.在这些情况下,不可能在类名称前加上目标标识符的前缀,因为这会使CD模型仅对其中一个目标有用. (6认同)

小智 30

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

实体:MyEntity类:My_App_Name.MyClass


Bar*_*zyk 16

记得删除你的模块:

在此输入图像描述

  • 这解决了我的问题. (2认同)

Lud*_*dry 9

取决于您是作为App vs Tests运行,问题可能是应用程序正在查找<appName>.<entityName>以及何时运行它作为测试它看起来像<appName>Tests.<entityName>.我此时使用的解决方案(Xcode 6.1)是不填充ClassCoreData UI中的字段,而是在代码中填写.

此代码将检测您是否作为App vs Tests运行,并使用正确的模块名称并更新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
}()
Run Code Online (Sandbox Code Playgroud)


Rie*_*ien 8

如果您在项目名称中使用连字符,如"My-App",则使用下划线而不是连字符,如"My_App.MyManagedObject".通常,查看xcdatamodeld文件的名称并使用与该名称相同的前缀.即"My_App_1.xcdatamodeld"需要前缀"My_App_1"


enr*_*eas 5

这可能有助于那些遇到同样问题的人.我是,使用Swift 2和Xcode 7 beta 2.

该解决方案在我的情况是注释掉@objc(EntityName)EntityName.swift.