CoreData:警告:无法加载命名的类

Jim*_*med 91 multithreading core-data nsmanagedobject swift

我正在使用Xcode 6.1将现有的Objective-C电视节目应用程序复制到新的Swift版本,并且我在使用CoreData时遇到了一些问题.

我创建了一个包含4个实体的模型,创建了它们的NSManagedObject子类(在Swift中),并且所有文件都设置了适当的应用程序目标(用于"编译源代码").

每当我尝试插入一个新实体时,我仍然会收到此错误:

CoreData:警告:无法为实体"显示"加载名为"显示"的类.找不到类,而是使用默认的NSManagedObject.

一些评论:

保存到Core Data时,我使用父子上下文方式来允许背景线程.我这样做是通过使用以下方法设置ManagedObjectContext:

lazy var managedObjectContext: NSManagedObjectContext? = {
  // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
  let coordinator = self.persistentStoreCoordinator
  if coordinator == nil {
    return nil
  }
  var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
  managedObjectContext.persistentStoreCoordinator = coordinator
  return managedObjectContext
}()
Run Code Online (Sandbox Code Playgroud)

并使用以下方法保存数据:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
  var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
  context.parentContext = self.managedObjectContext!
  ...rest of core data saving code here...
})
Run Code Online (Sandbox Code Playgroud)

Mun*_*ndi 171

这个警告是我们必须处理的一个怪癖,而Swift实现的细节正在被解决.该警告是虚假发生的,即即使您不遵循下面列出的步骤,您的设置也可能有效.

在大多数情况下,我已经能够通过确保在模型编辑器中正确设置类来摆脱它.与许多其他SOF帖子(包括此问题的答案)不同,包含模块名称(如MyApp.Shows)的建议对我没有帮助.

请务必检查以下三项:

1.
适用于Xcode 7 beta 3的版本

高达XCode7 b3

请注意,我将您的实体名称更正为更合适的单数.

适用于Xcode 7.1中的Swift 2.0的版本
(适用于Xcode 7 beta 4及更高版本)

您需要删除模块中的"当前产品模块"文本!

来自Xcode7 beta 3

2.
您也应该遵循频繁的建议包括:

@objc(Show)
Run Code Online (Sandbox Code Playgroud)

就在你的班级之上.

注意:如果您使用的是Xcode 7 beta 4或更高版本,则此步骤是可选的.

3.
还要确保所创建的管理对象到适当的类,作为默认的将只是NSManagedObject.

var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show", 
                 inManagedObjectContext: context) as Show
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,[我必须_remove_](http://stackoverflow.com/a/30873296/2446155)`@objc(MyClass)` (4认同)
  • 谢谢!我确实做了推荐的命名约定更新,并且'@ objc(Show)'似乎在修复'无法加载类...'错误方面做了伎俩.非常感激! (3认同)
  • @objc()绝对修复了它.谢谢 (3认同)

khu*_*han 68

SWIFT 2/XCODE 7更新:

这个问题(请参阅我在4月3日对此答案的评论)在Apple的Swift 2XCode 7测试版中得到了解决.所以你现在实际上并不需要在Swift中接受Mundi的回答或在你的Class名之前使用" ".它会停止工作.所以除去这些,只是把名义上的文件,并选择为模块 和欢呼声!@objc(myEntity)MyAppName.ClassCurrent Working Module

选择当前工作模块

但是对于那些@objc(myEntity)在Swift中使用的人(像我一样),你可以使用其他解决方案,而不是顺利运行.

在xcdatamodel正确的类中.它应该如下所示:

设置课程

干得好.Module.Class是Swift和XCode 6中CoreData的模式.在模型策略或其他CoreData内容中使用自定义策略类时,您还需要相同的过程. 注意:在图像中,名称和类应为Car和MyAppName.Car(或您实体的任何名称).这User是一个错字.

  • 是的,这无疑将得到解决.自动生成的类应@objc已被装饰(<类名称作为实体检查员进入>),或者更可能的是,苹果将让这个不必要的开始. (2认同)
  • 对于仍在阅读此书的人。使用'** MyAppName.Car **'对我不起作用,当我删除了'** MyAppName。**'部分时,它确实起作用了。因此,只有两个领域的“汽车”都可以解决问题。 (2认同)

San*_*aus 36

当使用Xcode 7和纯Swift时,我实际上必须从我自动生成的子类中删除 (从> 生成).@objc(MyClass)NSManagedObjectEditorCreate NSManagedObject Subclass...

  • 哇谢谢你发布这个答案.我正准备开始撞墙. (4认同)

Dun*_*age 12

在Xcode 7 beta 2中(我相信1),在模型配置中,将一个新的类型的托管对象File设置为Module Current Product Module,对象的类在配置中显示为.File.

受管对象类型的模块在Xcode 7中设置为

删除模块设置使其为空白,或删除句点,以便配置中的类名只是File等效的操作,因为每个都会导致另一个更改.保存此配置将删除描述的错误.

受管对象的模块在Xcode 7中设置为空白


小智 9

在Xcode 6.1.1中,您不需要添加@objc属性,因为基本实体是objc类(NSManagedObject)的子集(请参阅Swift类型兼容性.在CoreData中,需要完整的Module.Class名称.请注意模块name是Build Settings - > Packaging - > Product Module Name中设置的名称.默认设置为$(PRODUCT_NAME:c99extidentifier),它将是Target的名称.


Him*_*jan 5

使用xCode 7和Swift 2.0版本,您无需添加@objc(NameOfClass),只需更改"显示数据模型检查器"选项卡中的实体设置,如下所示 -

名称 - "您的实体名称"

类 - "您的实体名称"

模块 - "当前产品模块"

在此输入图像描述

实体类文件的代码将像(在我的代码中实体是家庭) -

import UIKit
import CoreData

class Family: NSManagedObject {

   @NSManaged var member : AnyObject
}
Run Code Online (Sandbox Code Playgroud)

这个例子在我的应用程序中使用xCode 7.0 + swift 2.0正常工作