Estoy trabajando en el desarrollo de 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 arreglarlo?
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:
ios
core-data
swift
nsmanagedobject
MsrButterfly
fuente
fuente
Respuestas:
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 que implementa las subclases de objetos gestionados de datos básicos se ha actualizado en consecuencia.
El inspector del modelo de datos tiene ahora 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 de objeto gestionado no debe marcarse con
@objc(classname)
(esto se observó en https://stackoverflow.com/a/31288029/1187415 ).Alternativamente, puede vaciar el campo "Módulo" (mostrará "Ninguno") y marcar las subclases de objetos administrados con
@objc(classname)
(esto se observó en https://stackoverflow.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. Como es una respuesta aceptada con muchos votos a favor y enlaces, he intentado 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 . ¡Entonces la atribución va a todos ellos, incluso si no los enumero específicamente!
Respuesta anterior para Xcode 6 :
Como se documenta en Implementación de subclases de objetos gestionados de datos básicos , debe prefijar el 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".
fuente
@objc(ClassName)
método sugerido en la respuesta de Christer.Solo como una nota al margen. Tuve el mismo problema. Y todo lo que tenía que hacer era agregar
@objc(ClassName)
mi archivo de clase.Ejemplo:
Y eso resolvió mi problema.
fuente
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 los demás. Si el nombre de su proyecto (módulo) tiene un espacio, debe reemplazar el espacio con un guión bajo. Por ejemplo:
Entidad: MyEntity Clase: My_App_Name.MyClass
fuente
Recuerde eliminar su módulo :
fuente
Dependiendo de si está ejecutando App vs Tests, el problema puede ser que la aplicación esté buscando
<appName>.<entityName>
y cuando se esté ejecutando como prueba<appName>Tests.<entityName>
. La solución que uso en este momento (Xcode 6.1) es NO llenar elClass
campo en la interfaz de usuario CoreData, y hacerlo en el código.Este código detectará si está ejecutando App vs Tests y usa el nombre del módulo correcto y actualiza el
managedObjectClassName
.fuente
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 "My_App.MyManagedObject". En general, mire 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"
fuente
Esto puede ayudar a quienes experimentan el mismo problema. Lo estaba, con Swift 2 y Xcode 7 beta 2.
La solución en mi caso fue comentar
@objc(EntityName)
enEntityName.swift
.fuente
Tuve la misma advertencia, aunque mi aplicación parecía funcionar bien. El problema fue que cuando ejecuté Editor> Crear subclase de NSManagedObject en la última pantalla, usé la ubicación predeterminada del grupo, sin mostrar ni marcar objetivos, lo que guardó la subclase en el directorio superior de MyApp donde se encontraba MyApp.xcodeproj.
La advertencia desapareció cuando en cambio cambié el Grupo para que estuviera en la subcarpeta MyApp y verifiqué el objetivo MyApp.
fuente
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 vuelva a agregarlos con el botón "+". Reconstruir: eso puede solucionarlo.
fuente
Por cierto, tenga cuidado con lo que agrega como prefijo: mi aplicación se llama "ABC-def" y Xcode ha convertido el "-" en un "_".
Para estar seguro, busque en el buscador, encuentre los archivos de su proyecto y vea lo que dice para su modelo de datos (por ejemplo, "ABC_def.xcdatamodeld") y use lo que está escrito EXACTAMENTE.
fuente
Las respuestas anteriores me ayudaron a resolver diferentes problemas relacionados con Objective-C (tal vez ayudará a alguien):
Si refactorizó los nombres de las entidades, no olvide cambiar también la "Clase" en el "Panel de utilidades".
fuente
Las respuestas anteriores me ayudaron, pero esto puede ayudar a alguien. Si, como yo, los hizo y todavía tiene un problema, recuerde simplemente "limpiar su proyecto". Para XCode8, Producto> Limpiar. Luego corre de nuevo.
fuente
En Xcode 7, los nombres de entidad y clase pueden ser iguales, pero Codegen debe ser definición de clase. En ese caso no habrá advertencia, etc. ingrese la descripción de la imagen aquí
fuente