无法找到NSManagedObject的特定子类

 青青河边羊 发布于 2022-12-31 10:39

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

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子类中定义实例方法?

编辑:

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

在此输入图像描述

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

    例:

    @objc(Person)
    class Person { }
    

    这解决了我的问题.

    2022-12-31 10:40 回答
  • 记得删除你的模块:

    在此输入图像描述

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

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

    在此输入图像描述

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

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


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

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


    Xcode 6的上一个答案:

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

    2022-12-31 10:41 回答
  • 取决于您是作为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
    }()
    

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

    2022-12-31 10:41 回答
  • 这可能有助于那些遇到同样问题的人.我是,使用Swift 2和Xcode 7 beta 2.

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

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

    实体:MyEntity类:My_App_Name.MyClass

    2022-12-31 10:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有