CoreData: advertencia: No se puede cargar la clase llamada


Estoy duplicando una aplicación de programa de TV Objective-C existente a una nueva versión de Swift usando Xcode 6.1 y estoy teniendo algunos problemas con CoreData.

He creado un modelo de 4 entidades, creado su subclase NSManagedObject (en Swift), y todos los archivos tienen los objetivos de la aplicación adecuados (para 'Compile Sources').

Todavía recibo este error cada vez que intento insertar una nueva entidad:

CoreData: advertencia: No se puede cargar la clase llamada 'Shows' para la entidad 'Shows'. Clase no encontrado, usando NSManagedObject predeterminado en su lugar.

Algunos comentarios:

Al guardar en Datos centrales, utilizo la forma de contexto padre-hijo para permitir el subproceso en segundo plano. Hago esto configurando managedObjectContext usando:

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
}()

Y guardando datos usando:

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...
})
Author: Dan Beaulieu, 2014-10-28

11 answers

Esta advertencia es una de las peculiaridades con las que tenemos que lidiar mientras se están planificando los detalles de la implementación de Swift. La advertencia ocurre espuriamente, es decir, su configuración podría funcionar incluso si no sigue los pasos descritos a continuación.

He podido deshacerme de ella en la mayoría de los casos asegurándome de que la clase esté configurada correctamente en el editor de modelos. A diferencia de muchas otras publicaciones de SOF (incluidas las respuestas a esta pregunta), la sugerencia de incluir el nombre del módulo (como MyApp.Shows) no me ha ayudado.

, asegúrese de revisar estos tres elementos:

1.
la Versión que funciona hasta Xcode 7 beta 3

Hasta XCode7 b3

Observe que he corregido el nombre de su entidad al singular más apropiado.

Versión que funciona para Swift 2.0 en Xcode 7.1
(Debería funcionar para Xcode 7 beta 4 y superior)

Debe eliminar el texto "Módulo de Producto actual" en Módulo!

De Xcode7 beta 3

2.
También debe seguir la recomendación frecuente de incluir

@objc(Show)

Justo por encima de su clase.

Nota: Si está utilizando Xcode 7 beta 4 o posterior, este paso es opcional.

3.
También asegúrese de enviar el objeto administrado creado a la clase adecuada, ya que el valor predeterminado sería simplemente NSManagedObject.

var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show", 
                 inManagedObjectContext: context) as Show
 161
Author: Mundi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-16 06:14:09

Actualización de SWIFT 2 / XCODE 7:

Este problema (ver mi comentario del 3 de abril sobre esta respuesta también) se resuelve en Swift 2 y XCode 7 versión beta de Apple. Así que en realidad ahora no necesita @objc(myEntity) en Swift como respondió Mundi o usando "MyAppName. " antes del nombre de la clase. Dejará de funcionar. Así que elimine estos, simplemente ponga Class nombre en Archivo y seleccione Current Working Module como Módulo y saludos!

Seleccionar el módulo de trabajo actual

Pero para aquellos que usan @objc(myEntity) en Swift (como yo), puede usar esta otra solución que funciona sin problemas.

En la clase xcdatamodel correct in. Debería verse así:

Configuración de la clase

Aquí tienes. Module.Class es el patrón para CoreData en Swift y XCode 6. También necesitará el mismo procedimiento cuando use la clase Custom Policy en Model Policy u otras cosas de CoreData. Una nota: En la imagen, El Nombre y La clase debe ser Car y MyAppName.Coche (o cualquiera que sea el nombre de su entidad). Aquí, User es un error tipográfico.

 62
Author: khunshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-16 10:16:54

Al usar Xcode 7 y puramente Swift, en realidad tuve que eliminar @objc(MyClass) from my auto-generated NSManagedObject subclass (generated from Editor > Crear Subclase NSManagedObject...).

 34
Author: Santa Claus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-16 16:34:24

En Xcode 7 beta 2 (y creo que 1), en la configuración del modelo un nuevo objeto administrado de tipo File se establece en el Módulo Current Product Module y la clase del objeto se muestra en la configuración como .File.

Módulo del tipo de objeto administrado establecido en" Módulo de Producto actual " en Xcode 7

Eliminar la configuración del módulo para que quede en blanco, o eliminar el punto completo para que el nombre de la clase en la configuración sea simplemente File son acciones equivalentes, ya que cada una causa el otro cambio. Guardar esta configuración eliminará el error descrito.

Módulo del objeto administrado configurado para estar en blanco en Xcode 7

 11
Author: Duncan Babbage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-27 04:03:25

En Xcode 6.1.1 no es necesario añadir el atributo @objc ya que la entidad base es un subconjunto de una clase objc (NSManagedObject) (ver Swift Type Compatibility. En CoreData el Módulo completo.El nombre de la clase es obligatorio. Tenga en cuenta que el nombre del módulo es lo que se establece en Configuración de compilación -> Empaquetado -> Nombre del módulo del producto. Por defecto se establece en $(PRODUCT_NAME: c99extidentifier) que será el nombre del destino .

 9
Author: Jim Malak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-07 14:44:52

Con xCode 7 y la versión Swift 2.0, no necesita agregar @objc (NameOfClass), simplemente cambie la configuración de la entidad en la pestaña" Mostrar el inspector del modelo de datos " como a continuación -

Nombre - "Su Nombre de Entidad"

Clase - "Su Nombre de Entidad"

Módulo - "Módulo de Producto Actual"

introduzca la descripción de la imagen aquí

El código para el archivo de clase de entidad será como (en mi código la entidad es la Familia) -

import UIKit
import CoreData

class Family: NSManagedObject {

   @NSManaged var member : AnyObject
}

Este ejemplo funciona bien en mi aplicación con xCode 7.0 + swift 2.0

 5
Author: Himanshu Mahajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 18:37:56

No olvide reemplazar PRODUCT_MODULE_NAME con el nombre del módulo del producto.

Cuando se crea una nueva entidad, debe ir al Inspector del Modelo de datos (última pestaña) y reemplazar PRODUCT_MODULE_NAME con el nombre de su módulo, o se producirá un error class not found al crear el coordinador de tienda persistente.

 2
Author: Kof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-16 16:23:04

También necesita usar (al menos con Xcode 6.3.2) el módulo.Clase al realizar su reparto, por ejemplo: Suponiendo que su módulo (es decir, el nombre del producto) es Comida y su clase es Fruta

let myEntity =  NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext)

let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit

Recapitulación:

  • Incluya el nombre del módulo al definir la entidad en el Editor de Modelos de datos (Nombre: Fruit, Clase: Food.Frutas)
  • Al acceder a la entidad en código (es decir, SWIFT), envíela con Module.clase (por ejemplo, Comida.Frutas)
 2
Author: Wizkid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-24 20:29:00

Cambiar el nombre de la Clase de la Entidad en el editor del Modelo de datos para que corresponda a la clase en cuestión y agregar @objc(NameOfClass) al archivo de cada NSManagedObject justo encima de la declaración de la clase resolvió este problema durante la Prueba Unitaria.

 1
Author: user3269767,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-31 08:21:26

También me encontré con un problema similar, siga estos pasos para resolver:

  1. El padre es NSManagedObject, no NSObject
  2. El módulo de an la entidad es predeterminada, no"Módulo de Producto actual"
 1
Author: WSJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 04:57:27

Lo que funcionó para mí (Xcode 7.4, Swift) es cambiar el nombre de la clase a <my actual class name>.<entity name> en el Entity inspector, el cuadro 'Class'.

Mi iniciador de la subclase objeto administrado, se ve así:

    convenience init(<properties to init>) {
    let entityDescr = NSEntityDescription.entityForName("<entity class name>", inManagedObjectContext: <managed context>)
    self.init(entity: entityDescr!, insertIntoManagedObjectContext: <managed context>)}
    //init properties here
 0
Author: mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-31 18:25:25