Error “clase desconocida en el archivo de comstackdor de interfaz” en el tiempo de ejecución

Aunque Interface Builder conoce una MyClass , aparece un error al iniciar la aplicación.

Esto sucede cuando MyClass forma parte de una biblioteca y no ocurre si compilo la clase directamente en el destino de la aplicación.

A pesar del error ” clase desconocida MyClass en el archivo de comstackdor de interfaz ” impreso en tiempo de ejecución, este problema no tiene nada que ver con Interface Builder, sino con el enlazador, que no está vinculando una clase porque ningún código lo usa directamente.

Cuando los datos .nib (comstackdos desde .xib) se cargan en tiempo de ejecución, se hace referencia a MyClass usando una cadena, pero el enlazador no analiza la funcionalidad del código, solo la existencia del código, por lo que no lo sabe. Como ningún otro archivo fuente hace referencia a esa clase, el enlazador la optimiza para que no exista al hacer el ejecutable. Entonces, cuando el código de Apple intenta cargar tal clase, no puede encontrar el código asociado e imprime la advertencia.

De forma predeterminada, los objectives de Objective-C tendrán -all_load -ObjC flags establecidos de forma predeterminada, lo que mantendrá todos los símbolos. Pero comencé con un objective de C ++, y no tenía eso. Sin embargo, encontré una forma de evitar esto, lo que mantiene al enlazador agresivo.

El truco que estaba usando originalmente era agregar una rutina estática vacía como:

 +(void)_keepAtLinkTime; 

que no hace nada, pero que llamaría una vez, como:

 int main( int argc, char** argv ) { [MyClass _keepAtLinkTime]; // Your code. } 

Esto obligaría al enlazador a mantener toda la clase, y el error desaparecerá.

Como señaló jlstrecker en los comentarios, realmente no necesitamos agregar un método _keepAtLinkTime . Simplemente llamando a uno existente, como:

  [MyClass class]; 

hace el truco (siempre que se deriva de un objeto NSObject ).

Por supuesto, puede llamar esto en cualquier ubicación de su código. Supongo que incluso podría estar en un código inalcanzable. La idea es engañar al enlazador para que piense que MyClass se usa en alguna parte para que no sea tan agresivo como para optimizarlo.

Xcode 6.3.2 y Swift 1.2

Swift definición de vista. Asegúrese de anular init(coder aDecoder: NSCoder) . Objective-C definición de controlador de vista. Y, una semilla en un peral.

Agregue el nombre del módulo al inspector de detalles de Nib donde elige su clase.

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 File Inspector a la derecha, con esa información .m-file)

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

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

Esto realmente no tiene nada que ver con el Interface Builder, lo que sucede aquí es que Xcode no está cargando los símbolos de su biblioteca estática. Para resolver este problema, debe agregar los -all_load -ObjC a la tecla Other Linker Flags las configuraciones de comstackción del proyecto (y posiblemente el destino).

Dado que Objective-C solo genera un símbolo por clase, debemos forzar al enlazador a cargar también los miembros de la clase mediante el indicador -ObjC, y también debemos forzar la inclusión de todos nuestros objetos de nuestra biblioteca estática agregando el enlazador -all_load bandera. Si omite estos indicadores tarde o temprano, se encontrará con el error de un unrecognized selector u obtendrá otras excepciones como la que ha observado aquí.

Me encontré con este problema hoy usando Swift.

Cambié una clase Model.h + Model.m a Model.swift . Este objeto se usó en Interface Builder con la class = Model .

Tan pronto como reemplacé el objeto, ya no se pudo cargar la clase.

Lo que tuve que hacer fue cambiar la referencia de clase en IB de:

 Class = Model Module = 

a

 Class = Model Module =  

Encontrará el en la configuración de comstackción. También es el nombre que aparece en su encabezado Swift generado: #import "TARGETNAME-Swift.h"

Vaya a “ProjectName”, haga clic en él, y luego vaya a la pestaña “Construir fases”, luego haga clic en “fonts de comstackción”, y luego haga clic en el botón “+”, aparecerá una ventana, elije “MyClass”. m “archivo y luego haga clic en” agregar “,

Construye el proyecto y ejecútalo, seguramente el problema se resolverá

Es un problema de caché de Xcode4, simplemente elimine todas las carpetas en / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /

Además, si tiene las mismas pruebas de problemas en su iPhone, elimine la aplicación anterior antes de ejecutarla …

Buena suerte. Pascual

En ocasiones, IBuilder omitió customModule="AppName" customModuleProvider="target"

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

  

a esto:

  

Vaya a Build Fases-> Compile Sources y agregue sus nuevos archivos .m.

En mi caso, ¡mostraba un error para una clase que ni siquiera existía! Sospeché que era algo que se volvió loco en el archivo del guión gráfico. Si no reconoce el archivo de clase en el error, intente esto:

1) abre tu proyecto en sublime u otro buen editor. Busque la clase a la que se hace referencia. 2) eliminar todo el bit que dice

 customClass="UnrecognizedClassName" 

3) guárdalo. 4) regrese a xcode y limpie el proyecto, e intente ejecutarlo ahora.

trabajó para mi.

enter image description here

Mi caso: al tratar de usar una clase de un marco rápido en mi proyecto objective c, obtuve este error. La solución fue agregar el Módulo (marco rápido) de la clase en Constructor de interfaz / Guión gráfico, como se muestra a continuación. Nada más

enter image description here

Solo quiero agregar esta respuesta ya que la mayoría, si no todas las respuestas aquí, suponen que la clase realmente existe … es solo que el enlazador / comstackdor es demasiado tonto para verlo … por lo tanto, las respuestas giran en torno a alertar al enlazador de la existencia de la clase o creando un truco para ‘forzar’ a existir.

mi problema ocurre cuando este mensaje está hablando de una clase inexistente … así que un ejemplo sería volver a una vieja revisión de git que no tiene conocimiento de una cierta clase … pero el comstackdor se queja de que la clase no lo dice t existe ..

¿solución?

  • Nuke todo el asunto! primero borre todos los archivos de comstackción, etc. eliminando todos los contenidos en este directorio ~ / Library / Developer / Xcode / DerivedData
  • elimine la aplicación del teléfono mismo (y borre los contenidos del simulador si está usando un simulador)

deberías ser bueno para ir después de eso

La mejor manera de eliminar el error es: 1) Seleccione el archivo de clase (.m) 2) En ” Membresía de destino “, “marque” la entrada del nombre del proyecto

Lo arreglé copiando el texto de mi clase.h y .m, borrando esos archivos de clase del proyecto y creando nuevos archivos class.h y .m con el mismo nombre usando “Agregar archivo”. Luego pegué el código nuevamente en los archivos nuevos, y todo funcionó muy bien. De alguna manera, los archivos no se vincularon correctamente cuando se crearon. No tuve que usar ningún indicador de enlazador después de eso.

Esto sucede porque el .xib tiene un enlace obsoleto al antiguo delegado de la aplicación que ya no existe. Lo arreglé así:

  • Haga clic derecho en .xib y seleccione Abrir como> Código fuente
  • En este archivo, busque el antiguo delegado de la aplicación y reemplácelo por el nuevo

solo agregue el código siguiente al inicio de la aplicación appdelegate para un método de evaluación final, entonces funcionará bien

[clase myclass];

FINALMENTE solucioné esto, olvidé agregar el siguiente código a mi archivo .m:

 @implementation MyTableViewCell @end 

Así que fue causado porque había creado una interfaz @ de marcador de posición para mi celda de tabla, que tenía una conexión con un elemento en el archivo .xib, pero hay un error en el Creador de interfaz donde si no se especifica @implementation para una clase, no puede encontrarlo

Había revisado todos los pasos de otros foros para ver .xib como fuente y ver MyTableViewCell aunque lo había comentado fuera de mi código. Intenté reiniciar el simulador. Incluso intenté dividir todas mis clases en archivos separados con el mismo nombre que las interfaces, pero nada funcionó hasta este momento.

PD: en mi experiencia, no importa si los nombres de los archivos .h / .m son diferentes de los nombres de la interfaz @. Tengo varios archivos que contienen más de una interfaz @ y funcionan bien.

PPS Tengo una explicación más detallada de por qué UITableViewCell y UICollectionViewCell causan este error en https://stackoverflow.com/a/22797318/539149 junto con cómo revelarlo en tiempo de comstackción usando registerClass: forCellWithReuseIdentifier :.

Intenté esto, y otras respuestas enumeradas en este sitio, ninguna de las cuales lo ordenó por mí. Estos comentarios (de http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) ayudaron:

Después de buscar, buscar y buscar, finalmente descubrí el nombre de esta clase eliminada oculta en un archivo. Tuve que abrir los archivos del constructor de interfaz en código X, haciendo clic derecho sobre ellos y eligiendo ‘ver como código fuente’. Luego, la búsqueda surgió con

  YES com.apple.InterfaceBuilder.IBCocoaTouchP lu gin *this was the class name* 

Simplemente eliminar esa última línea no lo arregla, desafortunadamente, quejándose de que hay una cantidad incorrecta de elementos en el archivo. Debe eliminar la línea correspondiente en la sección de líneas arriba, que se refiere a CustomClass .

En mi caso, tengo XCode6, el archivo .m de la clase especificada termina en el lugar equivocado en la fase de comstackción. Debería haber estado en Fuentes de comstackción , pero terminar en el Copie los recursos del paquete

Este problema no parece estar desactualizado.

Tuve el mismo problema con Xcode 8 y lo resolví de forma similar a smilebot :

  1. Abra su archivo del guión gráfico como “Código fuente” dentro de Xcode:

  2. Busque la clase a la que se hace referencia y elimine todo el fragmento que dice

customClass = “UnRecognizedClassName”

  1. Abra su archivo del guión gráfico como “interfacebuilder – storyboard” nuevamente y reconstruya su aplicación.

No solo en la configuración del proyecto, sino en la configuración de Target también debe agregar -all_load -ObjC flags …

Core-Plot: Clase desconocida CPLayerHostingView en el archivo Interface Builder

Simplemente elimine MyClass.m y .h y agréguelos al proyecto de nuevo para mí.

Tenía ‘FavouritesButton de clase desconocida en el archivo de Interface Builder’ y lo seguí hasta una escena de libro de cuentos donde el botón en cuestión tenía una clase personalizada falsa de “favouritesButton” en el campo Clase en la parte superior del Inspector de identidad. Quise poner ese valor en el siguiente campo: Etiqueta de identidad.

Cambiar esto a “UIButton” resolvió el problema.

Me encontré con esto en Swift.

Mover el archivo .xib a la carpeta Base.lproj del proyecto eliminó este error.

Este error surgió hoy al convertir mi aplicación aaLuminate a Universal en Xcode 4. Esta aplicación se basa en la plantilla de la utilidad y fue originalmente creada bajo Xcode 3.

Para ahorrar tiempo, copié las Vistas principal y Flipside del iPhone a los nombres apropiados en la aplicación Universal. Experimenté el error “Clase desconocida x en el archivo del generador de interfaz”. En mi caso, no era nada en los archivos XIB u objectives.

También había copiado el archivo aaLuminate-Info.plist por otros motivos: tenía una clave antigua “nombre base de archivo principal” establecida en MainWindow.

¡Tan pronto como eliminé esta clave, resolvió el problema!

En mi caso, recibí este error porque había intentado ahorrar algo de trabajo creando un nuevo proyecto y luego eliminando varios de los archivos fuente y copiando los archivos fuente del mismo nombre del proyecto en funcionamiento. También copié mi archivo MainStoryBoard que estaba buscando mi RootViewController. Sin embargo, cuando eliminé el RootViewController original y luego lo agregué al RootViewController del producto anterior, evidentemente, la operación Agregar archivos no pudo “marcar” el cuadro de destino como se sugirió anteriormente. Simplemente al visitar todos los archivos newley importados “.m” y asegurarse de que la casilla de membresía objective estaba marcada, todo estaba bien. Creo que lo que sucedía era que el archivo del guión gráfico estaba buscando una clase que había sido “excluida” del enlace porque la membresía objective no estaba marcada. Asegurarse de que los archivos necesarios para el destino estén así designados en la membresía objective en el inspector de archivos funcionó. Gracias Pat! (véase más arriba)

En mi caso fue porque declare una subclase de una subclase de una célula UITableView en el archivo .h (la statement de ambas subclases estaba en el mismo archivo .h), pero olvidé hacer una implementación vacía de esa segunda subclase en el archivo .m

¡no olvide implementar cualquier subclase de una subclase que declare en el archivo .h! suena simple, pero fácil de olvidar porque Xcode hará esto por usted si está trabajando con una clase por archivo .h / .m.

Tenía “RateView de clase desconocida en Interface Builder”, donde RateView era una subclase de UIView. Bajé una UIView en mi escena de Guión gráfico y cambié el campo Clase personalizada a RateView. Aún así, este error apareció.

Para depurar, cambié el nombre de mi clase a RateView2 y cambié todas las referencias para hacer coincidir, excepto el campo Clase personalizada de UIView. El mensaje de error todavía apareció como antes con RateView como la clase faltante. Esto confirmó que el mensaje de error estaba relacionado con el valor del campo Clase personalizada. Cambié este valor a RateView2 y el mensaje de error cambió a “Clase desconocida RateView2 en Interface Builder”. Progreso de tipo.

Finalmente, inspeccioné los archivos del código fuente ellos mismos en el Inspector de archivos. Allí descubrí que el archivo de código fuente (que había copiado de un tutorial) no estaba asociado con mi Target. En otras palabras, no tenía Membresía Target. Marqué la casilla que hizo que el archivo de código fuente de la clase sea miembro de la aplicación de destino y el mensaje de error desapareció.

En mi caso, eliminé una clase llamada “viewController” sin darme cuenta de que se había seleccionado con el inspector de identidad del guión gráfico (en la parte superior de “Clase personalizada”).

Simplemente tiene que seleccionar la clase correcta para el controlador de vista en el campo Clase personalizada del inspector de identidad o agregar una nueva clase a su proyecto y seleccionar esa como su Clase personalizada.

¡Trabajó para mi!

Agregué el archivo en Fase de comstackción en Objetivos y se resolvió el problema. Para conocer los pasos para agregar el archivo, vea mi respuesta en:

Error de Apple Mach-O Linker (APActivityIcon)

Esto me volvió loco un poco y ninguna de las sugerencias anteriores me ayudó a deshacerme del error. Afortunadamente, solo tenía un objeto IB utilizando la clase, así que lo eliminé y lo agregué con la misma clase especificada. El error desapareció …