我正在开发一个使用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子类中定义实例方法?
编辑:
我已经指定了实体的类,如下面的屏幕截图所示:
就像一个旁注.我遇到过同样的问题.而我所要做的就是添加@objc(ClassName)
我的类文件.
例:
@objc(Person) class Person { }
这解决了我的问题.
记得删除你的模块:
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".
取决于您是作为App vs Tests运行,问题可能是应用程序正在查找<appName>.<entityName>
以及何时运行它作为测试它看起来像<appName>Tests.<entityName>
.我此时使用的解决方案(Xcode 6.1)是不填充Class
CoreData 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 }()
如果您在项目名称中使用连字符,如"My-App",则使用下划线而不是连字符,如"My_App.MyManagedObject".通常,查看xcdatamodeld文件的名称并使用与该名称相同的前缀.即"My_App_1.xcdatamodeld"需要前缀"My_App_1"
这可能有助于那些遇到同样问题的人.我是,使用Swift 2和Xcode 7 beta 2.
该解决方案在我的情况是注释掉@objc(EntityName)
的EntityName.swift
.
这个问题的公认答案帮助我解决了同样的问题,但我有一个警告,我认为这对其他人有帮助.如果项目(模块)名称中有空格,则必须用下划线替换空格.例如:
实体:MyEntity类:My_App_Name.MyClass