Erreur «Classe inconnue dans le fichier Interface Builder» lors de l’exécution

Bien MyClass Builder connaisse MyClass , j’obtiens une erreur lors du démarrage de l’application.

Cela se produit lorsque MyClass fait partie d’une bibliothèque et ne se produit pas si je comstack la classe directement dans la cible de l’application.

Malgré l’ impression du fichier « Classe inconnue MyClass dans Interface Builder » lors de l’exécution, ce problème n’a rien à voir avec Interface Builder, mais plutôt avec l’éditeur de liens, qui ne lie pas une classe car aucun code ne l’utilise directement.

Lorsque les données .nib (compilées à partir du fichier .xib) sont chargées à l’exécution, MyClass est référencé à l’aide d’une chaîne, mais l’éditeur de liens n’parsing pas la fonctionnalité du code, il suffit de coder l’existence. Étant donné qu’aucun autre fichier source ne fait référence à cette classe, l’éditeur de liens l’exclut lors de la création de l’exécutable. Ainsi, lorsque le code d’Apple essaie de charger une telle classe, il ne trouve pas le code associé et imprime l’avertissement.

Par défaut, les cibles Objective-C auront les -all_load -ObjC définies par défaut, ce qui conservera tous les symboles. Mais j’avais commencé avec une cible C ++ et je ne l’avais pas. Néanmoins, j’ai trouvé un moyen de contourner cela, ce qui maintient le linker agressif.

Le hack que j’utilisais à l’origine était d’append une routine statique vide comme:

 +(void)_keepAtLinkTime; 

qui ne fait rien, mais que j’appellerais une fois, tel que:

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

Cela obligerait l’éditeur de liens à conserver toute la classe et l’erreur disparaît.

Comme jlstrecker l’a souligné dans les commentaires, nous n’avons pas vraiment besoin d’append une méthode _keepAtLinkTime . Il suffit d’appeler un existant, tel que:

  [MyClass class]; 

fait le tour (tant que vous dérivez d’un NSObject ).

Bien sûr, vous pouvez appeler cela dans n’importe quel endroit de votre code. Je suppose que cela pourrait même être en code inaccessible. L’idée est de tromper l’éditeur de liens en lui faisant croire que MyClass est utilisé quelque part afin qu’il ne soit pas trop agressif pour l’optimiser.

Xcode 6.3.2 & Swift 1.2

Définition rapide de la vue. Veillez à écraser init(coder aDecoder: NSCoder) . Objective-C definition du contrôleur de vue. Et une plume dans un poirier.

Ajouter un nom de module à l’inspecteur de détails Nib où vous choisissez votre classe.

J’ai corrigé cela en fonction de ce que Laura proposait, mais je n’avais pas besoin de recréer les fichiers.

  • En utilisant XCode 4, dans le navigateur de projet , sélectionnez le fichier .m contenant la classe dont il se plaint.

  • Allez dans Affichage-> Utilitaires-> Afficher l’inspecteur de fichiers
    (cela affichera l’ inspecteur de fichiers à droite, avec ces informations sur le fichier .m)

  • Ouvrez la section Appartenance à la cible et assurez-vous que votre cible est sélectionnée pour ce fichier .m

Lorsque j’ai ajouté mon fichier .m à mon projet, il ne l’a pas ajouté à ma cible par défaut pour une raison quelconque et cela m’a amené à obtenir l’erreur que vous avez mentionnée.

Cela n’a rien à voir avec Interface Builder, ce qui se passe ici, c’est que les symboles ne sont pas chargés depuis votre bibliothèque statique par Xcode. Pour résoudre ce problème, vous devez append les -all_load -ObjC la -all_load -ObjC indicateurs de -all_load -ObjC les -all_load -ObjC du projet (et éventuellement de la cible).

Comme Objective-C ne génère qu’un seul symbole par classe, nous devons forcer l’éditeur de liens à charger également les membres de la classe en utilisant le drapeau -ObjC, et nous devons également forcer l’inclusion de tous nos objects de notre bibliothèque statique en ajoutant l’ -all_load liens -all_load drapeau. Si vous ignorez ces indicateurs tôt ou tard, vous rencontrerez l’erreur du unrecognized selector ou obtenez d’autres exceptions telles que celle que vous avez observée ici.

J’ai rencontré ce problème aujourd’hui en utilisant Swift.

J’ai changé une classe Model.h + Model.m en Model.swift . Cet object a été utilisé dans Interface Builder avec la class = Model .

Dès que j’ai remplacé l’object, la classe ne pouvait plus être chargée.

Ce que je devais faire était de changer la référence de classe dans IB à partir de:

 Class = Model Module = 

à

 Class = Model Module =  

Vous trouverez le dans les parameters de construction. C’est aussi le nom qui apparaît dans votre Swift-Header généré: #import "TARGETNAME-Swift.h"

Allez dans le “Nom du projet”, cliquez dessus, puis allez dans l’onglet “Construire les phases”, puis cliquez sur “Comstackr les sources”, puis cliquez sur le bouton “+”, une fenêtre apparaîtra, choisissez “MyClass. m “fichier puis cliquez sur” append “,

Construire le projet et l’exécuter, le problème sera sûrement résolu

C’est un problème de cache Xcode4, supprimez simplement tous les dossiers sous / Utilisateurs / votre_utilisateur / Bibliothèque / Application Support / iPhone Simulator / 4.3 / Applications /

Si vous testez le même problème sur votre iPhone, supprimez l’ancienne application avant de l’exécuter …

Bonne chance. Pascual

Parfois, IBuilder a manqué customModule="AppName" customModuleProvider="target"

Pour résoudre ce problème, ouvrez le storyboard en tant que code source et remplacez cette ligne:

  

pour ça:

  

Allez dans Build Phases-> Comstack Sources et ajoutez vos nouveaux fichiers .m.

Dans mon cas, cela montrait une erreur pour une classe qui n’existait même pas! Je soupçonnais que c’était quelque chose qui avait été bloqué dans le fichier storyboard. Si vous ne reconnaissez pas le fichier de classe dans l’erreur, essayez ceci:

1) Ouvrez votre projet dans sublime ou un autre bon éditeur. Rechercher la classe visée. 2) supprimer le bit entier qui dit

 customClass="UnrecognizedClassName" 

3) le sauvegarder. 4) retournez à xcode et nettoyez le projet et essayez de l’exécuter maintenant.

travaillé pour moi

entrer la description de l'image ici

Mon cas – En essayant d’utiliser une classe dans un cadre rapide dans mon projet objective c, j’ai eu cette erreur. La solution consistait à append le module (framework rapide) de la classe dans le générateur Interface / Storyboard, comme indiqué ci-dessous. Rien d’autre

entrer la description de l'image ici

Je veux juste append cette réponse car la plupart des réponses, sinon toutes, supposent que la classe existe réellement. L’éditeur de liens / compilateur est trop stupide pour le voir. Les réponses tournent autour de l’alerte de l’éditeur de liens. de la classe ou créer un hack pour “forcer” l’exister ..

mon problème se produit quand ce message parle en fait d’une classe inexistante. Par exemple, je reviens à une ancienne révision de git qui ne connaît pas une certaine classe. Pourtant, le compilateur se plaint que cette classe ne t existe ..

Solution?

  • Nuke le tout! Supprimez d’abord tous les fichiers de construction, en supprimant tout le contenu de ce répertoire ~ / Library / Developer / Xcode / DerivedData
  • supprimer l’application du téléphone (et effacer le contenu du simulateur si vous utilisez un simulateur)

vous devriez être bon pour aller après ça

La meilleure façon de supprimer l’erreur est la suivante: 1) Sélectionnez le fichier de classe (.m) 2) Sous ” Abonnement cible “, “cochez” l’entrée du nom du projet

J’ai résolu ce problème en copiant le texte de class.h et .m, en supprimant les fichiers de classe du projet et en créant de nouveaux fichiers class.h et .m portant le même nom à l’aide de “Ajouter un fichier”. Ensuite, j’ai recollé le code dans les nouveaux fichiers, et tout a bien fonctionné. D’une manière ou d’une autre, les fichiers n’étaient pas liés correctement lors de leur création. Je n’ai pas eu besoin d’utiliser des drapeaux de l’éditeur de liens après cela.

Cela se produit car le fichier .xib contient un lien obsolète avec l’ancien délégué d’application qui n’existe plus. Je l’ai corrigé comme ça:

  • Faites un clic droit sur le fichier .xib et sélectionnez Ouvrir comme> Code source
  • Dans ce fichier, recherchez l’ancien délégué d’application et remplacez-le par le nouveau.

il suffit d’append le code ci-dessous au démarrage de la méthode appdelegate applicatoindidfinishlanching, alors cela fonctionnera très bien

[classe myclass];

J’ai finalement réparé ceci, j’avais oublié d’append le code suivant à mon fichier .m:

 @implementation MyTableViewCell @end 

Cela était dû au fait que j’avais créé un espace réservé @interface pour ma cellule de table, qui avait une connexion à un élément du fichier .xib, mais il y avait un bogue dans Interface Builder où si aucune @implementation n’était spécifiée pour une classe, il ne peut pas le trouver.

J’avais parcouru toutes les étapes à partir d’autres forums pour afficher le fichier .xib en tant que source et voir MyTableViewCell même si je l’avais commenté dans mon code. J’avais essayé de réinitialiser le simulateur. J’ai même essayé de briser toutes mes classes en fichiers distincts nommés les mêmes que les interfaces, mais rien n’a fonctionné jusqu’à cela.

PS dans mon expérience, peu importe si les noms des fichiers .h / .m sont différents des noms de @interface. J’ai plusieurs fichiers contenant plusieurs @interface et ils fonctionnent correctement.

PPS J’ai une explication plus détaillée de la raison pour laquelle UITableViewCell et UICollectionViewCell provoquent cette erreur sur https://stackoverflow.com/a/22797318/539149 et expliquent comment la révéler à la compilation en utilisant registerClass: forCellWithReuseIdentifier :.

J’ai essayé ceci et d’autres, les réponses listées sur ce site, aucune d’entre elles ne l’a sortingée pour moi. Ce commentaire (de http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) a aidé:

Après avoir recherché, recherché et recherché, j’ai finalement découvert le nom de cette classe supprimée cachée dans un fichier. J’ai dû ouvrir les fichiers du générateur d’interface en code X, en cliquant dessus avec le bouton droit de la souris et en choisissant «Afficher en tant que code source». Puis la recherche est venue avec

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

Supprimer cette dernière ligne ne résout malheureusement pas le problème, se plaignant du nombre incorrect d’éléments dans le fichier. Vous devez supprimer la ligne correspondante dans la section des lignes au-dessus, qui fait référence à CustomClass .

Dans mon cas, j’ai XCode6, le fichier de classe .m spécifié se retrouve au mauvais endroit en phase de construction – il aurait dû être sous des sources de compilation , mais finir dans la Copier des ressources de bundle

Ce problème ne semble pas être dépassé.

J’ai eu le même problème avec Xcode 8 et l’ ai résolu comme un smilebot :

  1. Ouvrez votre fichier de storyboard en tant que “code source” dans Xcode:

  2. Recherchez la classe à laquelle vous vous référez et supprimez le bit entier

customClass = “UnrecognizedClassName”

  1. Ouvrez à nouveau votre fichier de storyboard en tant que “interfacebuilder – storyboard” et reconstruisez votre application.

Non seulement dans les parameters du projet, mais dans le réglage de la cible, vous devez également append les indicateurs -all_load -ObjC.

Core-Plot: Classe inconnue CPLayerHostingView dans le fichier Interface Builder

Supprimez simplement MyClass.m et .h et ajoutez-les à nouveau au projet.

J’ai eu des faveurs de classe inconnuesButton dans le fichier Interface Builder et l’ai suivi dans une scène de storybook où le bouton en question avait une classe personnalisée de “favouritesButton” dans le champ Class en haut de l’inspecteur d’identité. Je voulais mettre cette valeur dans le champ suivant: Identity Label.

Changer cela en “UIButton” a résolu le problème.

J’ai couru dans ceci à Swift.

Le déplacement du fichier .xib dans le dossier Base.lproj du projet a éliminé cette erreur.

J’ai eu cette erreur aujourd’hui lors de la conversion de mon application aaLuminate en Universal sous Xcode 4. Cette application est basée sur le modèle d’utilitaire et a été initialement construite sous Xcode 3.

Pour gagner du temps, j’ai copié les vues principale et secondaire de l’iPhone sur les noms appropriés de l’application Universal. J’ai rencontré l’erreur “Classe inconnue x dans le fichier Interface Builder”. Dans mon cas, il n’y avait rien dans les fichiers ou les cibles XIB.

J’avais également copié le fichier aaLuminate-Info.plist pour d’autres raisons – il y avait une ancienne clé “Nom de base du fichier nib principal” définie sur MainWindow.

Dès que j’ai supprimé cette clé, le problème a été résolu!

Dans mon cas, j’ai eu cette erreur parce que j’avais essayé de sauver du travail en créant un nouveau projet, puis en supprimant plusieurs des fichiers source et en copiant les fichiers source du même nom du projet de travail. J’ai également copié mon fichier MainStoryBoard qui cherchait mon RootViewController. Cependant, lorsque j’ai supprimé le RootViewController d’origine et que je l’ai ajouté à RootViewController à partir du produit précédent, l’opération Add Files n’a pas réussi à “vérifier” la zone cible comme suggéré ci-dessus. En examinant simplement tous les fichiers “.m” importés de newley et en s’assurant que la case de membre cible était cochée, tout allait bien. Je pense que ce qui se passait était que le fichier de storyboard cherchait une classe qui avait été “exclue” du lien car l’appartenance à la cible n’était pas cochée. Faire en sorte que les fichiers requirejs pour la cible soient désignés comme tels dans l’adhésion cible de l’inspecteur de fichiers a fait l’affaire. Merci Pat! (voir au dessus)

Dans mon cas, c’était parce que j’ai déclaré une sous-classe d’une sous-classe d’une cellule UITableView dans le fichier .h (la déclaration des deux sous-classes était dans le même fichier .h), mais j’ai oublié d’implémenter cette deuxième sous-classe dans la Fichier .m

N’oubliez pas d’implémenter toute sous-classe d’une sous-classe que vous déclarez dans le fichier .h! semble simple, mais facile à oublier car Xcode le fera pour vous si vous travaillez avec une classe par fichier .h / .m.

J’ai eu “Classe inconnue RateView dans Interface Builder” où RateView était une sous-classe de UIView. J’avais déposé un UIView sur ma scène Storyboard et changé le champ Classe personnalisée en RateView. Pourtant, cette erreur est apparue.

Pour déboguer, j’ai changé le nom de ma classe en RateView2 et modifié toutes les références à l’exception du champ Classe personnalisée de l’UIView. Le message d’erreur apparaissait toujours comme auparavant avec RateView comme classe manquante. Cela a confirmé que le message d’erreur était lié à la valeur du champ Classe personnalisée. J’ai changé cette valeur à RateView2 et le message d’erreur a changé en “Classe inconnue RateView2 dans Interface Builder”. Progrès de toutes sortes

Enfin, j’ai inspecté les fichiers de code source eux-mêmes dans l’inspecteur de fichiers. J’ai découvert que le fichier de code source (que j’avais copié à partir d’un didacticiel) n’était pas associé à ma cible. En d’autres termes, il n’y avait pas d’adhésion cible. J’ai coché la case qui faisait du fichier de code source de la classe un membre de l’application cible et le message d’erreur disparaissait.

Dans mon cas, j’avais supprimé une classe appelée “viewController” ne réalisant pas qu’elle était sélectionnée avec l’inspecteur d’identité du storyboard (sous “Custom Class”, en haut).

Il vous suffit de sélectionner la classe appropriée pour le contrôleur de vue dans le champ Classe personnalisée de votre inspecteur d’identité ou d’append une nouvelle classe à votre projet et de la sélectionner comme classe personnalisée.

Travaillé pour moi!

J’ai ajouté le fichier sous la phase de construction dans les cibles et le problème a été résolu. Pour connaître la procédure à suivre pour append le fichier, consultez ma réponse à l’adresse suivante:

Erreur Apple Mach-O Linker (APActivityIcon)

Cela m’a rendu un peu fou et aucune des suggestions ci-dessus ne m’a aidé à éliminer l’erreur. Heureusement, je n’avais qu’un seul object IB utilisant la classe, alors je l’ai simplement supprimé et ajouté avec la même classe spécifiée. Erreur est parti …