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...
})
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
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!
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
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 pongaClass
nombre en Archivo y seleccioneCurrent Working Module
como Módulo y saludos!
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í:
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.
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...).
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
.
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.
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 .
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"
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
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.
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)
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.
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:
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
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