A pesar de que Interface Builder es consciente de MyClass
un error, recibo un error al iniciar la aplicación.
Esto sucede cuando MyClass
es parte de una biblioteca, y no sucede si compilo la clase directamente en el destino de la aplicación.
A pesar de que Interface Builder es consciente de MyClass
un error, recibo un error al iniciar la aplicación.
Esto sucede cuando MyClass
es parte de una biblioteca, y no sucede si compilo la clase directamente en el destino de la aplicación.
Respuestas:
A pesar del error " Clase desconocida MyClass en el archivo Interface Builder " impreso en tiempo de ejecución, este problema no tiene nada que ver con Interface Builder, sino con el vinculador, que no vincula una clase porque ningún código lo usa directamente.
Cuando los datos .nib (compilados a partir de .xib) se cargan en tiempo de ejecución, MyClass
se hace referencia a ellos utilizando una cadena, pero el vinculador no analiza la funcionalidad del código, solo la existencia del código, por lo que no lo sabe. Dado que ningún otro archivo fuente hace referencia a esa clase, el vinculador lo optimiza fuera de existencia 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.
Por defecto, los objetivos de Objective-C tendrán -all_load -ObjC
banderas establecidas de forma predeterminada, que mantendrán todos los símbolos. Pero había comenzado con un objetivo 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 forzaría al vinculador a mantener toda la clase y el error desaparecerá.
Como jlstrecker señaló en los comentarios, en realidad no necesitamos agregar un _keepAtLinkTime
método. Simplemente llamando a uno existente, como:
[MyClass class];
hace el truco (siempre y cuando se derive de un NSObject
).
Por supuesto, puede llamar a 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 vinculador para que piense que MyClass
se usa en algún lugar para que no sea tan agresivo al optimizarlo.
Definición rápida de vista. Asegúrese de anular init(coder aDecoder: NSCoder)
. Definición Objective-C de controlador de vista. Y una punta en un peral.
Agregue el nombre del módulo al inspector de detalles de Nib donde elija su clase.
MyClass
. Simplemente llame a un método del que hereda NSObject
, como +class
.
MyClass.m
en la sección Membresía de destino del Inspector de archivos.
Arreglé esto siguiendo las líneas de lo que sugirió Laura, pero no necesitaba volver a crear los archivos.
Con 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, no lo agregó a mi destino predeterminado por alguna razón y eso me provocó el error que mencionó.
Esto realmente no tiene nada que ver con Interface Builder, lo que está sucediendo 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
indicadores a la Other Linker Flags
clave de la configuración de compilación del proyecto (y posiblemente el objetivo).
Dado que Objective-C solo genera un símbolo por clase, debemos obligar al vinculador a cargar los miembros de la clase también mediante el uso del indicador -ObjC, y también debemos forzar la inclusión de todos nuestros objetos desde nuestra biblioteca estática agregando el -all_load
indicador del vinculador. Si se saltea estas banderas tarde o temprano, se encontrará con el error unrecognized selector
u obtendrá otras excepciones, como la que ha observado aquí.
-ObjC
bandera sola lo arregló en mi caso.
-ObjC
es lo suficientemente bueno para solucionar el problema.
Me encontré con este problema hoy usando Swift.
Cambié una clase Model.h + Model.m
a una Model.swift
. Este objeto se usó en Interface Builder con class = Model
.
Tan pronto como reemplacé el objeto, la clase ya no se pudo cargar.
Lo que tuve que hacer fue cambiar la referencia de clase en IB de:
Class = Model
Module =
a
Class = Model
Module = <TARGETNAME>
Lo encontrarás <TARGETNAME>
en la configuración de compilación. También es el nombre que aparece en el encabezado rápido generado:#import "TARGETNAME-Swift.h"
Module
nombre estaba allí en el menú desplegable. Era el nombre de mi aplicación.
Vaya a "ProjectName", haga clic en él, luego vaya a la pestaña "Fases de compilación", y luego haga clic en "compilar fuentes", y luego haga clic en el botón "+", aparecerá una ventana, elija "MyClass". m "archivo y luego haga clic en" agregar ",
Construye el proyecto y ejecútalo, el problema seguramente se resolverá
Es un problema de caché Xcode4, simplemente elimine todas las carpetas en / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /
Además, si tiene el mismo problema al probar en su iPhone, elimine la aplicación anterior antes de ejecutarla ...
Buena suerte. Pascual
A veces IBuilder 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">
customModule="MyFrameworkName"
. Enorme +10
Mi caso: al intentar usar una clase desde un marco rápido en mi proyecto objetivo c, recibí este error. La solución fue agregar el Módulo (marco rápido) de la clase en Interface Builder / Storyboard como se muestra a continuación. Nada más
Vaya a Fases de compilación-> Compilar fuentes y agregue sus nuevos archivos .m.
¡En mi caso, estaba mostrando un error para una clase que ni siquiera existía! Sospeché que era algo que se metió 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 lo que dice
customClass="UnrecognizedClassName"
3) guardarlo. 4) regrese a xcode y limpie el proyecto, e intente ejecutarlo ahora.
trabajó para mi.
customClass="MyCla"
). En lugar de eliminar la asignación de clase personalizada, fue prudente para mí simplemente poner en la clase que pretendía usar en primer lugar :)
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 vinculador / compilador es demasiado tonto para verlo ... por lo tanto, las respuestas giran en torno a alertar al vinculador de la existencia de la clase o creando un truco para 'forzar' que exista.
mi problema ocurre cuando este mensaje en realidad está hablando de una clase inexistente ... así que un ejemplo sería volver a una antigua revisión de git que no tiene conocimiento de cierta clase ... sin embargo, el compilador se queja de que dicha clase no t existe ..
¿solución?
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 mis class.h y .m, eliminando 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 nuevos archivos, y todo funcionó muy bien. De alguna manera, los archivos no estaban vinculados correctamente cuando se crearon. No necesitaba usar ningún indicador de enlace después de eso.
Finalmente lo arreglé, me había olvidado de agregar el siguiente código a mi archivo .m:
@implementation MyTableViewCell
@end
Entonces, fue causado porque había creado un marcador de posición @interface para mi celda de tabla, que tenía una conexión con un elemento en el archivo .xib, pero hay un error en Interface Builder donde si no se especifica @implementation para una clase, No puede encontrarlo.
Había seguido todos los pasos de otros foros para ver el .xib como fuente y ver MyTableViewCell a pesar de que lo había comentado en mi código. Intenté restablecer el simulador. Incluso intenté dividir todas mis clases en archivos separados con el mismo nombre que las interfaces, pero nada funcionó hasta esto.
PD: en mi experiencia, no importa si los nombres de los archivos .h / .m son diferentes de los nombres de @interface. Tengo varios archivos que contienen más de una @interface 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 compilación usando registerClass: forCellWithReuseIdentifier :.
Esto sucede porque el .xib tiene un enlace obsoleto con el antiguo delegado de aplicaciones que ya no existe. Lo arreglé así:
Intenté esta y otras respuestas enumeradas en este sitio, ninguna de las cuales lo resolvió para mí. Estos comentarios (de http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) ayudaron:
Después de buscar y buscar y buscar, finalmente descubrí el nombre de esta clase eliminada oculta en un archivo. Tuve que abrir los archivos del generador de interfaz en código X, haciendo clic derecho sobre ellos y seleccionando 'ver como código fuente'. Luego, al buscarlo, surgió
<object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string> <string>*this was the class name*</string>
Desafortunadamente, simplemente eliminar esa última línea no lo soluciona, quejándose de que hay un número incorrecto de elementos en el archivo. Debe eliminar la línea correspondiente en la sección de líneas que se encuentra arriba, a la que se refiere CustomClass
.
En mi caso, tengo XCode6, el archivo de clase .m especificado termina en el lugar incorrecto en la fase de compilación. Debería haber estado en Orígenes de compilación , pero terminar en el
No solo en la configuración del proyecto, sino también en la configuración de destino, debe agregar -todos_cargar -ObjC flags ..
Core-Plot: clase desconocida CPLayerHostingView en el archivo de Interface Builder
Este problema no parece estar desactualizado.
Tuve el mismo problema con Xcode 8 y lo resolví de forma similar a smilebot :
Abra su archivo de guión gráfico como "Código fuente" dentro de Xcode:
Busque la clase a la que se hace referencia y elimine todo el bit que dice
customClass = "UnrecognizedClassName"
Tenía 'FautouritesButton en el archivo Interface Builder de clase desconocida' y lo rastreé hasta una escena de libro de cuentos donde el botón en cuestión tenía una clase falsa personalizada de "favouritesButton" en el campo Clase en la parte superior del Inspector de identidad. Tenía la intención de 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 apareció hoy al convertir mi aplicación aaLuminate a Universal en Xcode 4. Esta aplicación se basa en la plantilla de la utilidad y se creó originalmente en Xcode 3.
Para ahorrar tiempo, copié las vistas principal y invertida del iPhone a los nombres apropiados en la aplicación Universal. Experimenté el error "Clase desconocida x en el archivo de Interface Builder". En mi caso, no había nada en los archivos u objetivos XIB.
También había copiado el archivo aaLuminate-Info.plist por otras razones: tenía una antigua clave "Nombre base del archivo de punta principal" establecida en MainWindow.
¡Tan pronto como borré esta clave, solucionó el problema!
En mi caso, recibí este error porque intenté guardar algo de trabajo creando un nuevo proyecto y luego eliminando varios de los archivos de origen y copiando los archivos de origen del mismo nombre del proyecto de trabajo. También copié mi archivo MainStoryBoard que buscaba mi RootViewController. Sin embargo, cuando eliminé el RootViewController original y luego agregué el RootViewController del producto anterior, evidentemente la operación Agregar archivos no pudo "marcar" la casilla de destino como se sugirió anteriormente. Simplemente visitando todos los archivos ".m" importados de newley y asegurándose de que la casilla de membresía objetivo estuviera marcada, todo estaba bien. Creo que lo que estaba sucediendo era que el archivo del guión gráfico estaba buscando una clase que había sido "excluida" del enlace porque la membresía objetivo no estaba marcada. Asegurarse de que los archivos necesarios para el objetivo estén designados en la membresía de destino en el inspector de archivos hizo el truco. Gracias Pat! (véase más arriba)
En mi caso, fue porque declaró una subclase de una subclase de una celda UITableView en el archivo .h (la declaración de ambas subclases estaba en el mismo archivo .h), pero olvidé hacer una implementación vacía de esa segunda subclase en el archivo archivo .m.
¡no olvide implementar ninguna subclase de una subclase que declare en el archivo .h! suena simple, pero fácil de olvidar porque Xcode lo hará por usted si está trabajando con una clase por archivo .h / .m.
Tenía "Clase desconocida RateView en Interface Builder", donde RateView era una subclase de UIView. Había dejado caer una UIView en mi escena de Storyboard y cambié el campo de la clase personalizada a RateView. Aún así, apareció este error.
Para depurar, cambié el nombre de mi clase a RateView2 y cambié todas las referencias para que coincidan, excepto el campo Clase personalizada de UIView. El mensaje de error todavía apareció como antes con RateView como la clase que falta. 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 todo tipo.
Finalmente, inspeccioné los archivos de código fuente 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 fuera miembro de la aplicación de destino y el mensaje de error desapareció.
En mi caso, había eliminado una clase llamada "viewController" sin darme cuenta de que estaba seleccionada con el inspector de identidad del guión gráfico (en 'Clase personalizada' en la parte superior).
Simplemente tiene que seleccionar la clase correcta para el controlador de vista en el campo Clase personalizada de su inspector de identidad o agregar una nueva clase a su proyecto y seleccionarla como su Clase personalizada.
¡Trabajó para mi!
Agregué el archivo en Fase de compilación en objetivos y el problema se resolvió. Para conocer los pasos para agregar el archivo, vea mi respuesta en:
Esto me volvió loco por un momento y ninguna de las sugerencias anteriores me ayudó a deshacerme del error. Afortunadamente, solo tenía un objeto IB que usaba la clase, así que lo eliminé y lo volví a agregar con la misma clase especificada. El error se fue ...