Error de Xcode 6: clase desconocida en el archivo de Interface Builder

600

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

Clase X desconocida en el archivo de Interface Builder.

Se bloquea 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.

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 desde cero porque podría estar dañado de alguna manera.

Editar: También me gustaría agregar que intenté limpiar, restablecer el simulador, jugar con las fases de construcción, etc. Nada de eso funciona.

Byte épico
fuente
Posible duplicado de stackoverflow.com/questions/3416269/…
Bouke
1
@ ImreKelényi Tienes razón. Esto me sucedió nuevamente nuevamente después de hacer lo que acaba de describir.
Byte épico
Esto funcionó para mí, stackoverflow.com/questions/1725881/…
vrunoa
Fue un error tipográfico para mí, depúrelo en el elemento Control, hasta que llegue, seleccione; Controlador de vista> inspector de identidad> Clase personalizada> Clase. eliminar eso si esa clase no está definida.
rebeldes
99
¡TENGA EN CUENTA! Este "error" puede provenir de diferentes orígenes. Si la respuesta aceptada no funciona para usted, baje e intente la siguiente respuesta. La respuesta correcta para mi situación fue la quinta respuesta.
Jacksonkr

Respuestas:

1454

Resolví este problema mientras escribía la pregunta. Pensé que respondería a mi pregunta y la dejaría 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 propios 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 Entrar.

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

Tenga en cuenta que si presionar 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 Entrar. 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: enter image description here

Byte épico
fuente
70
Para mí, hacer clic dentro de "Módulo" y presionar enter no funcionó de manera consistente, pero seleccionar el campo "Clase" (y presionar enter) siempre funcionó.
Imre Kelényi
2
Para mí, el objetivo se estableció correctamente, pero la clase aún no apareció en IB. Sin embargo, noté que la "Ubicación" del archivo mostraba una ruta "Relativa al Proyecto" en lugar de "Relativa al Grupo". Eliminar la referencia del archivo Y el grupo y volver a agregarlo en la raíz del proyecto funcionó para mí.
knl
8
Guau. Gracias por esto, no creo que hubiera llegado allí de lo contrario. Esto solucionó un problema que comenzó a suceder después de que agregué @objc(...)a una de mis clases Swift.
ndbroadbent
12
Este problema todavía está presente en XCode 7.2. Esta solución funcionó.
Tom Fast
3
Esto sigue siendo un problema en Xcode 8.3.1 ... una pena
Sepehr Behroozi
99

A veces se perdió Xcode 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">
ChikabuZ
fuente
77
En realidad, en mi caso tuve que eliminar customModuleProvider, luego el error desapareció.
Maciej Swic
3
¡Guillermo, sigue sucediendo en Xcode a fines de marzo!
Ed Manners
3
@MaciejSwic Quitarlo customModuleProvidertambién lo hizo por mí, ¡gracias!
Sakiboy
1
¿Qué pasa con los archivos xib?
SleepsOnNewspapers
77
Todavía sucede ... son cosas como esta las que me dan ganas de llorar :(
Lucas
72

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

@objc(ForumTopicListViewController) class ForumTopicListViewController
usuario1760527
fuente
44
Esto lo arregló para mí, lo tuve @objc class Xy cambié a @objc(X) class Xtrabajar.
Joe
1
También puede intentar eliminar sus datos derivados, consulte stackoverflow.com/questions/24039932/…
user1760527
Tuve este problema después de cambiar el nombre de la clase ViewController predeterminada de la plantilla de proyecto Single View. Me pregunto qué magia se usó para que la @objc()directiva no fuera necesaria para la clase ViewController 'original' ...
Berend Klein Haneveld
Yo voy por el lado opuesto. Había especificado el nombre del módulo en el archivo Storyboard pero también agregué la directiva @objc.
WeZZard
1
NO funcionó para mí. :( Tampoco funciona la solución del nombre del Módulo.
mythicalcoder
64

Proyecto con múltiples objetivos

En mi caso, estoy trabajando en un proyecto con múltiples objetivos y el problema era "heredar de Target" no estaba marcado. Seleccionar "heredar del objetivo" resolvió mi problema

ingrese la descripción de la imagen aquí

Muhammad Nayab
fuente
Gracias por publicar esto. Resolvió el problema que estaba viendo muy rápidamente.
JaredH
Tuve una situación similar. (XCode 9.4.1) Creé una aplicación para iOS llamada FilesTestA, con una UIView personalizada llamada MxFileView (que consistía en MxFileView.swift y MxFileView.xib). Luego agregué otro objetivo: un widget Today ("FilesTestAWidget"). Solución para usar MxFileView en el widget: (1) class = "MxFileView"; (2) marque "Heredar módulo del destino" (o desactívelo e ingrese manualmente "FilesTestAWidget"); (3) en el destino de la aplicación, asegúrese de que tanto MxFileView.swift como MxFileView.xib incluyan FilesTestAWidget en su Membresía de destino.
Kenster999
Esto me sucedió en un nuevo proyecto de la plantilla predeterminada en Xcode 10.1 (un solo objetivo de aplicación iOS y 2 objetivos de prueba). La casilla de verificación no estaba marcada para todos mis controladores de vista personalizados (por lo que el texto del marcador de posición era "Ninguno"). Después de revisar y marcar la casilla de verificación de cada controlador de vista personalizado en mi guión gráfico, el problema se resolvió.
Mason
58

Esto funcionó para mí ...

Verifique su fuente compilada, si ese archivo (p. Ej., ViewController.m) está agregado o no, en mi caso el archivo ViewController no fue agregado por lo que me estaba dando el error.

ingrese la descripción de la imagen aquí

rebeldes
fuente
@CarmenA Solo agrega archivos '.m' a Compile Sources. Esta es realmente la solución correcta (y única) para algunos.
Jacksonkr
Probé varias de las otras soluciones sin suerte. Esto hizo el truco. Por alguna extraña razón, a un objetivo le faltaba el único archivo fuente que me estaba dando ajustes.
galactikuh
para mí también. Sucedió debido a que algunos obtuvieron resolución de conflictos
Eldhose
46

Esto puede suceder en cualquier Xcode superior a 6.0. Me sucedió después de renombrar algunas clases de ViewController en el proyecto Swift (pero supongo que también sucederá con Obj-C). Solo tiene que abrir el generador de interfaces, vaya al Inspector de identidad de ViewController que cambió el nombre de su clase, seleccione la clase y presione Entrar. Eso reasignará la clase renombrada al ViewController seleccionado y también restablecerá el valor del módulo 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 se bloquea y no imprime nada. Estuve persiguiendo ese accidente fantasma durante una hora solo para descubrir que era exactamente lo mismo: clase no asignada en IB. Si obtiene algunos bloqueos fantasmas, primero verifique IB para las clases no asignadas.

jovanjovanovic
fuente
gracias por esto. parece que seguir su sugerencia hace que Xcode actualice el módulo (bajo la clase en IB) de Ninguno a Actual. Estoy pensando que el problema es que simplemente ingresar el nombre sin presionar enter no activa una actualización del módulo por Xcode.
rockiesGrizzly
Esto funcionó para mí. Inadvertidamente renombré una clase de controlador, por lo que obviamente ya no existía cuando se cargó el controlador de vista.
Litehouse
32

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. Vaya al controlador y asegúrese de que tenga la membresía objetivo establecida en la aplicación actual.

Furqan Khan
fuente
Este también fue el problema para mí: múltiples objetivos conducen a que el archivo de clase accidentalmente no se incluya en el objetivo que estaba construyendo.
Ryan Kreager
Fusioné archivos y pierdo esto en uno de mis objetivos, gran respuesta
Benjamin Jimenez
Buena, fusionar pbx rompió los valores de membresía objetivo.
sistema
32

La habilitación Inherit Module From Targettomó el módulo de destino correcto. Eso resolvió el problema.

ingrese la descripción de la imagen aquí

Arnab
fuente
Confirmar. Esto me ayudó a resolver el problema.
Chris8447
Por lo general, tengo este problema cuando convierto un controlador de vista de Objective-C a Swift. Vuelvo a escribir la última letra y presiono Enter. Debería hacer el truco también.
DevNebulae
30

Mi respuesta: configurar el módulo personalizado igual al nombre de 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 vistas personalizadas clases de de Pod (o Carthage marco ).

Infraestructura: XCode8, Swift3

ingrese la descripción de la imagen aquí

Tamara
fuente
18

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

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

y reemplazarlo con esto:

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

No puedo creer cuántas horas estoy perdiendo para evitar errores en el compilador Swift y Xcode 6

Orlin Georgiev
fuente
17

Seleccionando el apropiado Modulepara miCustom Class resolví este problema.

Aquí está :

ingrese la descripción de la imagen aquí

Roy
fuente
13

Me enfrenté a 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 customModuleycustomModuleProvider de la entidad de control.

Hizo un truco para mí.

George Maisuradze
fuente
Ja! Nice hack :)
Vexy
10

Yo tuve el mismo problema.

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

Por lo tanto, le recomiendo verificar si su CustomClass.m está allí.

ingrese la descripción de la imagen aquí

Espero que esto te ayude.

rcmstark
fuente
¡Esto es lo que me pasó y afortunadamente encontré mi salida! Venía a contestar pero tú fuiste el primero. ¡¡¡Gracias!!!
Gabriel Piffaretti
9

Enfrenté este problema en Xcode 6.1 cuando eliminé Main.storyboardel LaunchScreen.xibarchivo y las ViewControllerclases predeterminadas de mi proyecto.

Lo arreglé eliminando las entradas Launch Screen Filey Main InterfacedeInfo.plist

Vinay Jain
fuente
9

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

Jakub Truhlář
fuente
8

Busqué en Google por todas partes para esto. Ninguna de las respuestas me funcionó hasta que conocí a un tipo que me pidió que moviera mi carpeta de proyecto al escritorio. Simplemente funcionó automáticamente. Aparentemente, si tiene su carpeta de proyecto en profundidad en muchas carpetas, XCODE realmente se rompe.

VBaarathi
fuente
Tengo este problema en Xcode 7 beta 5 nuevamente desde que lo tuve en Xcode 6 antes. Esta vez, este método funciona para mí.
Jake Lin
1
En visual studio hay un problema similar. Pero allí, recibimos un mensaje de advertencia claro que dice que el camino es demasiado largo y que las cosas no se pueden agregar o editar. No estoy seguro de si es lo mismo con XCODE, pero después de ese episodio mantengo todos mis proyectos en documentos o en el escritorio y nunca volví a tener este problema. Incluso le di este consejo a alguien que usa Xamarin Studio y también funcionó para ellos ...
VBaarathi
7

Estos pasos me funcionan.

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

ARWIN
fuente
Esto funcionó para mí también. Incluso lo hice funcionar sin borrar los datos derivados.
jaytrixz
Esto funcionó para mí, muchas gracias Arwin, pero aún no entiendo por qué está generando ese error porque no modifiqué nada en la clase o en el IB antes
Kirtikumar A.
7

Resolví esto 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.

Buscador de espectros
fuente
6

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

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

Bouke
fuente
Eliminar y volver a agregar el archivo de clase funcionó para mí. ¡Gracias!
Nicolas Miari
6

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 todos los controles de vista y vistas.

También es posible que 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" tanto en ViewController como en Ver paréntesis angulares.

Teng largo
fuente
6

Mi solución (Xcode 8.1 Swift 3.0):

Clase desconocida xxx en el archivo Interface Builder.

Abra StoryBoard como código fuente y busque xxx . Eliminar el atributo que contiene el valor xxx . Construye y corre.

ibrahimyilmaz
fuente
WTF? Esto fue absolutamente necesario para mí, gracias. Tuve que eliminar elcustomModule="" customModuleProvider=""
Dan Rosenstark
1
Si intentamos publicar una aplicación en la tienda de aplicaciones que contenga un error como este, la aplicación se rechazará sin pensarlo.
ibrahimyilmaz
Estoy en desacuerdo. Acabo de enviar una compilación que tuve que modificar de esta manera a TestFlight y está listo para la Prueba Beta ... veremos qué sucede en la tienda de aplicaciones real, pero es un error de IMO de IB. ¡Gracias!
Dan Rosenstark
4

En mi caso, he añadido un indicador -ObjCde Other Linker Flagsen la configuración del proyecto para hacer que funcione. También lo intenté con -all_loadflag y funcionó bien también.

ingrese la descripción de la imagen aquí

Rostyslav Druzhchenko
fuente
3

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

Para solucionarlo, otorgue a esa clase .hy .marchivos la misma Membresía de destino que sus otras clases.

No se ha establecido una membresía objetivo.

pkamb
fuente
Este era mi problema, pero al intentar varias soluciones causé el problema que corrige la respuesta de Epic Byte. Debe tener su código fuente en el objetivo que está creando, pero también en IB debe configurar el controlador de vista para que sea parte del objetivo actual.
SafeFastExpressive
La membresía objetivo también fue mi problema, busqué en todas partes, pero gracias a esta respuesta pude resolverlo.
Borzh
3

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

DenisKirillov
fuente
2
Algún ejemplo con explicación sería genial.
Nilambar Sharma
2

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

xhg
fuente
2

Arreglé esto siguiendo las líneas de lo que sugirió Laura, pero no necesitaba volver a crear los archivos.

Usando XCode 4, en el Navegador de proyectos, seleccione el archivo .m que contiene la clase de 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 de archivo .m)

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, por alguna razón no lo agregó a mi destino predeterminado y eso me provocó el error que mencionó.

Jignesh Kalantri
fuente
2

Mi problema fue un error del usuario. Tenía un UIView genérico en mi guión gráfico y en la sección Clase personalizada del Inspector de identidad cambié accidentalmente el nombre de UIView a galimatías.

Todo lo que se necesitó para arreglarlo fue volver a cambiarlo a UIView.

Scooter
fuente
Hice lo mismo, pero accidentalmente agregué el nombre de los Controladores de vista personalizada a la sección de clase personalizada de la vista raíz de ViewControllers. Así que estaba buscando ver por qué View Controller no se pudo encontrar cuando era la vista raíz todo el tiempo.
TMin
1

Lo que solo funcionó para mí es 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 así es como Apple quiere que lo hagamos ahora.

Esta pregunta muestra 3 posibles soluciones alternativas en beta 4 ... aparentemente Apple no ha sido muy útil en esta situación, según algunos, porque lo llaman "Trabajar según lo previsto".

SH
fuente
1

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

Mi solución fue agregar el nombre del módulo en el generador de interfaces manualmente.

patrickS
fuente
1

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 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 solo la referencia) y luego volver a agregarlos usando 'Agregar archivos', esta vez comprobando ambos objetivos.

JulianSymes
fuente