objective - ios 12 core data
No se puede encontrar una subclase específica de NSManagedObject (13)
Estoy trabajando en desarrollar una aplicación con Core Data. Cuando creé una instancia usando:
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)
Recibí una advertencia en el registro:
CoreData: warning: Unable to load class named ''User'' for entity ''User''. Class not found, using default NSManagedObject instead.
¿Cómo podría solucionarlo?
Y otra pregunta, ¿cómo puedo definir un método de instancia en la subclase NSManagedObject?
Editar:
He especificado la clase de la entidad como en la siguiente captura de pantalla:
Dependiendo de si se está ejecutando como App vs Tests, el problema puede ser que la aplicación está buscando <appName>.<entityName>
y cuando se está ejecutando como prueba se ve como <appName>Tests.<entityName>
. La solución que uso en este momento (Xcode 6.1) es NO llenar el campo Class
en la IU de CoreData, y hacerlo en código.
Este código detectará si está ejecutando como App vs Tests y usará el nombre del módulo correcto y actualizará 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
}()
En Xcode 7, los nombres de Entidad y Clase pueden ser los mismos, pero Codegen debe ser Definición de clase. En ese caso no habrá advertencia, etc. ingrese la descripción de la imagen aquí
Esto puede ayudar a aquellos que experimentan el mismo problema. Yo estaba, con Swift 2 y Xcode 7 beta 2.
La solución en mi caso fue comentar @objc(EntityName)
en EntityName.swift
.
La respuesta aceptada a esta pregunta me ayudó a resolver el mismo problema, pero tenía una advertencia que pensé que sería útil para otros. Si su nombre de proyecto (módulo) tiene un espacio en él, debe reemplazar el espacio con un guión bajo. Por ejemplo:
Entidad: MyEntity Class: My_App_Name.MyClass
Las respuestas anteriores fueron útiles. Este rápido control de cordura puede ahorrarle algo de tiempo. Vaya a Proyecto> Fases de compilación> Compilar fuentes y elimine su xcdatamodeld y sus archivos de modelo con el botón "-", y luego agréguelos de nuevo con el botón "+". Reconstrucción: eso puede solucionarlo.
Las respuestas anteriores me ayudaron a resolver diferentes problemas relacionados con Objective-C (tal vez ayudará a alguien):
Si rediseñó nombres de entidades, no se olvide de cambiar "Clase" en "Panel de utilidades" también.
Las respuestas anteriores me ayudaron, pero esto puede ayudar a alguien. Si, como yo, los hiciste y todavía tienes un problema, recuerda simplemente "limpiar tu proyecto". Para XCode8, Producto> Limpio. Luego corre de nuevo.
Por cierto, tenga cuidado con lo que agrega como prefijo: Mi aplicación se llama "ABC-def" y Xcode ha convertido "-" en "_".
Para estar seguro, busque en el buscador, encuentre sus archivos de proyecto y vea lo que dice para su modelo de datos (por ejemplo, "ABC_def.xcdatamodeld") y use lo que está escrito EXACTAMENTE.
Recuerde eliminar su módulo :
Si está usando un guión en el nombre de su proyecto como "Mi-Aplicación", use un guión bajo en lugar del guión como "Mi_Aplicación.MiEjecutadoObjeto". En general, observe el nombre del archivo xcdatamodeld y use el mismo prefijo que en ese nombre. Es decir, "My_App_1.xcdatamodeld" requiere el prefijo "My_App_1"
Solo como una nota al margen. tuve el mismo problema Y todo lo que tuve que hacer fue agregar @objc(ClassName)
en mi archivo de clase.
Ejemplo:
@objc(Person)
class Person { }
Y eso resolvió mi problema.
Tuve la misma advertencia, aunque mi aplicación parecía funcionar bien. El problema era que al ejecutar Editor> Crear subclase NSManagedObject en la última pantalla usaba la ubicación predeterminada del grupo, sin mostrar o marcar objetivos, que guardaba la subclase en el directorio superior de MyApp donde estaba ubicado MyApp.xcodeproj.
La advertencia desapareció cuando, en cambio, cambié el Grupo para que estuviera en la subcarpeta MyApp y verifiqué el objetivo MyApp.
Actualización para Xcode 7 (final): ya no es necesario anteponer el nombre del módulo a la clase (como en Xcode 6 y las primeras versiones beta de Xcode 7). La documentación de Apple Implementando Subclases de Objetos Administrados de Datos Básicos se ha actualizado en consecuencia.
El inspector del modelo de datos ahora tiene dos campos "Clase" y "Módulo" para una entidad:
Cuando crea una subclase de objeto gestionado Swift para la entidad, el campo "Módulo" se establece en "Módulo de producto actual" y con esta configuración, la creación de instancias funciona tanto en la aplicación principal como en las pruebas unitarias. La subclase del objeto gestionado no se debe marcar con @objc(classname)
(esto se observó en https://.com/a/31288029/1187415 ).
Alternativamente, puede vaciar el campo "Módulo" (se mostrará "Ninguno") y marcar las subclases de objetos gestionados con @objc(classname)
(esto se observó en https://.com/a/31287260/1187415 ).
Observación: esta respuesta se escribió originalmente para Xcode 6. Hubo algunos cambios en las diversas versiones beta de Xcode 7 con respecto a este problema. Dado que es una respuesta aceptada con muchos votos ascendentes y enlaces a ella, he tratado de resumir la situación para la versión final actual de Xcode 7.
Hice mi propia "investigación" y leí todas las respuestas tanto a esta pregunta como a la pregunta similar. CoreData: advertencia: no se puede cargar la clase nombrada . ¡Así que la atribución va para todos ellos, incluso si no los enumero específicamente!
Respuesta anterior para Xcode 6 :
Tal como se documenta en Implementación de subclases de objetos administrados de datos centrales , debe agregar un prefijo al nombre de la clase de entidades en el campo Clase en el inspector de entidades modelo con el nombre de su módulo, por ejemplo "MyFirstSwiftApp.User".