ios - Xcode 6 Extraño error: clase desconocida en el archivo de Interface Builder


Actualicé a Xcode 6 beta 4 y ahora mi aplicación se cuelga continuamente con el mensaje

Clase desconocida X en el archivo de Interface Builder.

Se cuelga porque supuestamente Xcode no puede encontrar mis clases personalizadas que he vinculado en mi Storyboard, pero muestra que están vinculadas correctamente en la interfaz de Xcode.

He pasado horas tratando de resolver esto, ¡pero nada funciona! Estoy seguro de que todo está vinculado correctamente. Mi única otra opción puede ser eliminar todo el archivo del guión gráfico y comenzar de cero porque podría estar dañado de alguna manera.

Editar: También me gustaría añadir que traté de limpiar, reiniciar el simulador, jugar con las fases de construcción, etc. Nada de eso funciona.




Answers


Resolví este problema mientras escribía la pregunta. Pensé que respondería a mi pregunta y la dejo aquí para cualquier otra persona que pueda enfrentar este problema al usar Xcode 6 beta 4.

Para resolver este problema, debe seleccionar cada uno de sus objetos de clase personalizados en Storyboard (esto incluye cualquier vista personalizada, incluso los controladores de vista personalizados).

Luego, con esos objetos seleccionados, abra el inspector de identidad y en "Clase personalizada" debería ver la opción Módulo. Haga clic dentro del cuadro de texto Módulo y presione enter.

¡Eso es! El módulo actual para todos mis objetos personalizados debe haberse configurado incorrectamente de forma interna en Xcode 6 beta 4. Pero no había una indicación visual de esto en el inspector.

Tenga en cuenta que si al pulsar Intro dentro del cuadro de texto Módulo no funciona, intente seleccionar la flecha a la derecha y seleccione manualmente su módulo actual, luego borre el cuadro de texto y presione enter. También puede intentar presionar enter dentro del cuadro de texto de la clase (aunque esto generalmente es para resolver un problema diferente).

Aquí hay una imagen para aclarar las cosas:




A veces Xcode se perdió customModule="AppName" customModuleProvider="target"

Para solucionarlo, abra el guión gráfico como código fuente y reemplace esta línea:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">

a esto:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">



Tuve este problema después de cambiar el nombre de una clase rápida. Lo resolvió usando la directiva @objc:

@objc(ForumTopicListViewController) class ForumTopicListViewController



Esto funcionó para mí ...

Verifique su fuente compilada, ya sea que ese archivo (por ejemplo, ViewController.m) se agregue o no, en mi caso no se agregó el archivo ViewController, por lo que me dio el error ...




Esto puede suceder en cualquier Xcode por encima de 6.0. Me pasó después de cambiar el nombre de algunas clases de ViewController en el proyecto Swift (pero supongo que sucederá con Obj-C también). Solo tiene que abrir el constructor de interfaz, ir al Inspector de Identidad de ViewController que tuvo su clase renombrada, seleccionar clase y presionar Enter. Eso reasignará la clase renombrada a ViewController seleccionado y también restablecerá Module Value, que se pierde después de cambiar el nombre de la clase.

Actualización para Xcode 8.1 (probablemente 8.0 también):

Xcode 8.1 simplemente se bloquea. Simplemente y molestamente solo se bloquea y no imprime nada. Estuve persiguiendo ese accidente fantasma durante una hora solo para descubrir que era lo mismo: clase no asignada en IB. Si tienes algunos bloqueos fantasma, primero revisa IB para ver si hay clases sin asignar.




A veces, el controlador que está proporcionando pierde su membresía objetivo de la aplicación actual. En ese caso, presionar Enter en el campo "Módulo" no hará nada. Dirígete al controlador y asegúrate de que tenga una membresía objetivo establecida en la aplicación actual.




Mi respuesta: establezca el Módulo personalizado igual al nombre del Pod personalizado (en mi ejemplo - nombre de clase personalizado) como en la captura de pantalla adjunta

Esta solución es para un caso específico : para clases de vistas personalizadas del marco Pod (o Cartago ).

Infraestructura: XCode8, Swift3




Lo arreglé haciendo exactamente lo contrario de lo que ChikabuZ sugirió (gracias por señalarlo, sin embargo). En el archivo del guión gráfico, encuentra esto:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

y reemplázalo con esto:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">

No puedo creer la cantidad de horas que pierdo al encontrar errores en el compilador Swift y Xcode 6




Encabecé este problema en Xcode 8 , para resolverlo tuve que modificar el guión gráfico en el editor de texto.

En general, busque su control y elimine customModule y customModuleProvider de la entidad de control.

Hice un truco para mí




Main.storyboard este problema en Xcode 6.1 cuando Main.storyboard , el archivo LaunchScreen.xib y las clases predeterminadas de ViewController de mi proyecto.

Lo arreglé borrando las entradas de Launch Screen File y Main Interface de Info.plist




Busqué en Google en todas partes para esto. Ninguna de las respuestas funciona para mí hasta que conocí a 1 amigo que me pidió que moviera la carpeta de mi proyecto al escritorio. Simplemente funcionó automáticamente. Aparentemente si tienes tu carpeta de proyectos en muchas carpetas, XCODE se rompe.




Yo tuve el mismo problema.

En mi caso, Xcode no agregaba mi clase personalizada a: Target> Build Phase> Compile Sources.

Así que te recomiendo que verifiques si tu CustomClass.m está allí.

Espero que esto te ayude.




Verifique si su clase tiene la Membresía Target correcta.




Estos pasos funcionan para mí.

1) Borrar datos derivados.
2) Eliminar los archivos .h y .m
3) Crear archivos .h y .m nuevamente




Lo resolví abriendo mi archivo de guión gráfico como código fuente y usando el comando -F para buscar mi clase desconocida y eliminar la clase personalizada asociada a ella.




Lo que @gfrs dijo es correcto, debe configurar el Módulo. Sin embargo, una vez me encontré con un problema de que mi clase no figuraba en el menú desplegable Class . Finalmente eliminé el archivo rápido, reinicié Xcode y volví a crear el archivo. Finalmente, la clase fue enumerada y podría ser utilizada en Storyboard.

También eche un vistazo a esta respuesta , que parece resolver el problema "real" que encontré.




Resolví este problema escribiendo el nombre del Módulo (desafortunadamente la lista desplegable no mostrará nada ...) en la Clase Personalizada del inspector de identidad para todas las controladoras y vistas.

Es posible que también deba indicar el proveedor objetivo. Para lograr este objetivo, puede abrir el guión gráfico en modo de código fuente y agregar el atributo "customModuleProvider" en ViewController y View angle corchetes.




En mi caso, la clase a la que se hace referencia en Storyboard / xib no tenía el conjunto de Membresía objetivo .

Para solucionarlo, proporcione a los archivos .h y .m esa clase la misma Membresía objetivo que sus otras clases.




Mi solución (Xcode 8.1 Swift 3.0):

Clase desconocida xxx en el archivo de Interface Builder.

Abre StoryBoard como código fuente y busca xxx . Eliminar atributo que contiene el valor xxx . Construir y ejecutar




Me enfrenté al problema cuando porté el guión gráfico del proyecto Swift al proyecto Objective-c, noté la respuesta de vvkuznetsov y resultó que los dos proyectos usaban el mismo identificador. I "Producto -> Limpiar" y pulse la tecla Intro en el campo de texto Módulo y Clase. el problema desapareció




Mi solución fue eliminar @objc de la definición de clase personalizada.




Arreglé esto en la línea de lo que sugirió Laura, pero no necesité recrear los archivos.

Usando XCode 4, en Project Navigator, seleccione el archivo .m que contiene la clase sobre la que se queja.

Vaya a Ver-> Utilidades-> Mostrar inspector de archivos (esto mostrará el Inspector de archivos a la derecha, con esa información .m-file)

Abra la sección Membresía de destino y asegúrese de que su objetivo esté seleccionado para este archivo .m

Cuando agregué mi archivo .m a mi proyecto, no lo agregué a mi objetivo predeterminado por algún motivo y eso me provocó el error que mencionaste.




Al seleccionar el Module adecuado para mi Custom Class , resolví este problema.

Aquí está :




Lo único que funcionó para mí es en realidad agregar el nombre del módulo al archivo xib ...

Entonces, los archivos xib se ven así:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

Solución HORRIBLE en mi opinión, pero supuestamente es como Apple quiere que lo hagamos ahora.

Esta pregunta muestra 3 posibles regresos en la versión beta 4 ... aparentemente, Apple no ha sido de mucha ayuda en esta situación, según algunos, porque lo llaman "Funcionando según lo previsto".




Tuve el mismo problema con Xcode versión 6.1 (6A1052d). Creo que el problema aparece si cambiaste el nombre de tu proyecto de la aplicación / Xcode.

Mi solución fue agregar el nombre del módulo en el constructor de interfaz de forma manual.




Tuve este problema después de agregar un nuevo objetivo, luego creé una nueva clase usando el cuadro de diálogo 'Nuevo archivo' pero accidentalmente no pude verificar el nuevo objetivo así como el objetivo original en el cuadro de diálogo de creación, por lo que el objeto solo se agregó a mi objetivo original. La solución fue eliminar los archivos de origen (eliminar sólo referencia) y luego agregarlos usando 'Agregar archivos', esta vez comprobando ambos objetivos.




La solución fue diferente para mí. Debe agregar el .m de la clase a las fuentes compiladas de la fase de compilación del objetivo.

¡Espero que esto ayude!




Seleccione su archivo de clase desconocido, abra la pestaña del inspector de archivos, verifique su nombre de Target Membership en Target Membership . Ahí tienes.




En mi caso, agregué un indicador -ObjC a Other Linker Flags en la configuración del proyecto para que funcione. También probé con -all_load flag y funcionó bien también.




Me enfrenté a tal problema en Xcode 6 cuando eliminé los archivos ya incluidos ViewController.h & ViewController.m de mi nuevo proyecto basado en vistas, y eliminé la escena que estaba relacionada con esta clase del guión gráfico, Xcode cambia estos archivos en una carpeta de datos derivados , así que si intenta ir a Ventana -> Proyectos -> su_proyecto y eliminar los datos derivados, todo irá bien.