"Classe inconnue dans le fichier Interface Builder" erreur à l'exécution

même si Interface Builder est au courant d'un MyClass , je reçois 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 compile la classe directement dans la cible de l'application.

254
demandé sur jhoule 2009-11-13 01:33:53

30 réponses

malgré le" Classe inconnue MyClass dans le fichier Interface Builder. erreur " imprimé au moment de l'exécution, cette question n'a rien à voir avec Interface Builder, mais plutôt avec l'éditeur de liens, ce qui n'est pas relier une classe, car aucun code n'utilise directement.

Quand le .les données de la nib (compilées à partir du .xib) est chargé à l'exécution, MyClass est référencé à l'aide d'une chaîne de caractères, mais le linker n'analyse pas la fonctionnalité du code, juste l'existence du code, donc il ne savoir que. Comme aucun autre fichier source ne fait référence à cette classe, le linker l'optimise hors de l'existence lors de la création de l'exécutable. Ainsi, lorsque le code D'Apple essaie de charger une telle classe, il ne peut pas trouver le code qui lui est associé, et affiche l'avertissement.

par défaut, les cibles de L'objectif-C auront des drapeaux -all_load -ObjC par défaut, qui conserveront tous les symboles. Mais j'avais commencé avec une cible C++, et je n'avais pas. Néanmoins, j'ai trouvé un moyen de contourner cela, qui maintient l'éditeur de liens agressif.

le hack que j'utilisais à l'origine était pour ajouter une routine statique vide comme:

+(void)_keepAtLinkTime;

qui ne fait rien, mais que j'appellerais une fois, comme:

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

cela forcerait le linker à garder toute la classe, et l'erreur disparaît.

comme jlstrecker l'a souligné dans les commentaires, nous n'avons pas vraiment besoin d'ajouter une méthode _keepAtLinkTime . Simplement en appelant un existant, tel que:

   [MyClass class];

fait l'affaire (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 ça pourrait même être en code inaccessible. L'idée est de duper le linker en pensant que MyClass est utilisé quelque part pour qu'il ne soit pas si agressif en l'optimisant.

Xcode 6.3.2 & Swift 1.2

définition Swift de vue. Assurez-vous de remplacer init(coder aDecoder: NSCoder) . Objectif-c définition de contrôleur de vue. Et, une plume dans un poirier.

ajouter le nom du Module à nib details inspector où vous choisissez votre classe.

217
répondu jhoule 2015-06-28 02:44:52

j'ai corrigé cela dans le sens de ce que Laura avait suggéré mais je n'avais pas besoin de recréer les fichiers.

  • en utilisant le XCode 4, dans le Project Navigator , sélectionnez le .m fichier qui contient la classe dont il se plaint

  • allez à la vue- > Utilities- > Show File Inspector

    (ceci montrera le File Inspector à droite, avec que .m-fichier info)

  • ouvrez la section Target Membership et assurez-vous que votre cible est sélectionnée pour cela .m-file

quand j'ai ajouté mon .m fichier de mon projet, il n'a pas l'ajouter à ma cible par défaut pour une raison quelconque, et qui m'a fait l'erreur que vous avez mentionné.

183
répondu Pat 2012-10-13 13:47:03

cela n'a pas vraiment quelque chose à voir avec Interface Builder, ce qui se passe ici est que les symboles ne sont pas chargés à partir de votre bibliothèque statique par Xcode. Pour résoudre ce problème, vous devez ajouter les options -all_load -ObjC à la touche Other Linker Flags des paramètres de construction du projet (et éventuellement de la cible).

comme L'Objectif-C ne produit qu'un symbole par classe, nous devons forcer le linker à charger les membres de la classe aussi en utilisant le drapeau-ObjC, et nous doit également forcer l'inclusion de tous nos objets de notre bibliothèque statique en ajoutant le drapeau -all_load linker. Si vous sautez ces drapeaux tôt ou tard, vous rencontrerez l'erreur unrecognized selector ou obtiendrez d'autres exceptions comme celle que vous avez observée ici.

65
répondu Alasdair Allan 2013-10-15 09:35:40

j'ai rencontré ce problème aujourd'hui en utilisant Swift.

j'ai changé une classe Model.h + Model.m en Model.swift . Cet objet a été utilisé dans Interface Builder avec le class = Model .

dès que j'ai remplacé l'objet, la classe ne pouvait plus être chargée.

ce que j'ai dû faire était de changer la référence de classe dans IB de:

Class = Model
Module = 

à

Class = Model
Module = <TARGETNAME>

vous trouverez le <TARGETNAME> dans les paramètres de construction. C'est aussi le nom qui apparaît dans L'en-tête Swift généré: #import "TARGETNAME-Swift.h"

25
répondu Besi 2015-03-12 14:54:20

Aller à la "Nomprojet" , cliquez dessus , puis allez les "phases de construction" onglet , puis cliquez sur "compiler des sources" , puis cliquez sur le bouton"+", une fenêtre apparaît , choisissez "Maclasse.m" fichier", puis cliquez sur "ajouter" ,

construisez le projet et exécutez-le , le problème sera sûrement résolu

20
répondu Subbu 2012-12-13 05:42:55

c'est un problème de cache Xcode4, il suffit de supprimer tous les dossiers sous /Utilisateurs/your_user/Bibliothèque/Application Support/Simulateur d'iPhone/4.3/Applications/

aussi si vous avez le même problème tester sur votre iPhone, supprimer l'ancienne application avant de l'exécuter...

bonne chance. Pascual

19
répondu Ignacio Pascual 2012-03-28 00:49:16

parfois IBuilder manqué customModule="AppName" customModuleProvider="target"

pour le corriger, ouvrir storyboard comme code source et remplacer cette ligne:

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

à ceci:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
16
répondu ChikabuZ 2014-11-30 16:13:12

aller pour construire des Phases-> compiler des Sources et ajouter votre nouveau .m fichiers.

13
répondu Jackie Lee 2012-07-10 17:07:10

Dans mon cas, il montrait une erreur pour une classe qui n'existe même pas! J'ai suspecté que c'était quelque chose qui a été borné dans le fichier du 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. De recherche pour la classe de référence. 2) Enlever tout le morceau qui dit

customClass="UnrecognizedClassName"

3) enregistrer. 4) retour à xcode et nettoyer le projet, et essayer de l'exécuter maintenant.

travaillait pour moi.

enter image description here

13
répondu smileBot 2013-11-12 18:47:27

mon cas-essayer d'utiliser une classe d'un cadre swift dans mon projet objectif c, j'ai eu cette erreur. La Solution était d'ajouter Module (swift framework) de la classe dans Interface builder/ Storyboard comme indiqué ci-dessous. Rien d'autre

enter image description here

12
répondu Dhilip 2017-04-05 15:14:35

je veux juste ajouter cette réponse car la plupart sinon toutes les réponses ici supposent que la classe existe réellement.. c'est juste que l'éditeur de liens/compilateur est trop con pour le voir.. ainsi, les réponses tournent autour soit d'alerter le linker de l'existence de la classe ou de créer un hack pour la "force" existe-t-il..

mon problème se produit lorsque ce message parle d'une classe inexistante.. donc un exemple serait moi revenir à un vieux git révision qui n'a pas connaissance d'une certaine classe.. pourtant le compilateur se plaint que ladite classe n'existe pas..

Solution

?

  • Nuke le tout! tout d'abord supprimer tous les fichiers de construction, etc en supprimant tous le contenu dans ce répertoire ~/Bibliothèque/Développeur/Xcode/DerivedData
  • supprimer l'application du téléphone lui-même (et effacer le simulateur contenu si vous utilisez un simulateur)

vous devriez être bon d'aller après que

9
répondu abbood 2017-05-23 11:47:17

La meilleure façon de supprimer l'erreur est: 1) Sélectionnez le fichier de classe (.m) 2) en Vertu de l' " Target Adhésion ", "vérifier" le nom du Projet entrée

9
répondu Amit B 2013-09-04 10:35:34

j'ai corrigé ceci en copiant le texte de ma classe.h et .m, supprimer ces fichiers de classe du projet, et créer une nouvelle classe.h et .m fichiers avec le même nom en utilisant "Add File". Puis j'ai remis le code dans les nouveaux fichiers, et tout a bien fonctionné. Les fichiers n'étaient pas correctement liés quand ils ont été créés. Je n'ai pas eu besoin d'utiliser de drapeaux après ça.

8
répondu Laura 2010-11-21 15:25:15

J'ai finalement corrigé cela, j'avais oublié d'ajouter le code suivant à mon .m fichier:

@implementation MyTableViewCell

@end

donc il était causé parce que j'avais fait un placeholder @interface pour ma cellule de table, qui avait une connexion à un élément dans le .XIB file, mais il y a un bug dans Interface Builder où si aucune @implementation n'est spécifiée pour une classe, il ne peut pas le trouver.

j'avais passé par toutes les étapes d'autres forums de regarder le .xib comme source et voir MyTableViewCell même si je l'avais commenté hors de mon code. J'avais essayé de réinitialiser le simulateur. J'ai même essayé de diviser toutes mes classes en fichiers distincts nommés de la même façon que les interfaces, mais rien n'a fonctionné jusqu'à ça.

selon mon expérience, peu importe si le nom du .h./les fichiers m sont différents des noms de l'interface@. J'ai plusieurs fichiers contenant plus d'une @interface et qu'ils fonctionnent très bien.

P. P. S. j'ai une explication plus détaillée de pourquoi Uitable Viewcell et UICollectionViewCell causent cette erreur à https://stackoverflow.com/a/22797318/539149 ainsi que la façon de le révéler lors de la compilation en utilisant registerClass: forCellWithReuseIdentifier:.

7
répondu Zack Morris 2017-05-23 12:03:01

cela se produit parce que le .xib a un lien périmé avec L'ancienne application Delegate qui n'existe plus. Je l'ai fixé ainsi:

  • clic droit sur le .xib et sélectionnez Ouvrir comme > code Source
  • dans ce fichier, rechercher L'ancien délégué App et le remplacer par le nouveau
6
répondu S B 2011-07-19 04:44:31

il suffit d'Ajouter ci-dessous le code au début de appdelegate applicatoindfinishlanching méthode,puis il fonctionnera très bien

[classe de myclass];

6
répondu iSpark 2012-08-16 08:47:36

j'ai essayé ceci, et d'autres, les réponses figurant sur ce site, aucun triées pour moi. Ce commentaire (de http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) aidé:

après avoir cherché, cherché et cherché, j'ai finalement découvert le nom de cette classe supprimée cachée dans un fichier. J'ai dû ouvrir les fichiers de l'interface builder en X-code, en Les cliquant avec le bouton droit de la souris et en choisissant l'option "afficher en tant que source code".

<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>

simplement supprimer cette dernière ligne ne le Répare pas malheureusement, se plaignant qu'il ya le mauvais nombre d'éléments dans le fichier. Vous devez supprimer la ligne correspondante dans la section des lignes au-dessus d'elle, qui se réfère à CustomClass .

5
répondu user776904 2011-05-30 23:46:02

Dans mon cas, j'ai XCode6, la classe spécifiée .m fichier se retrouve au mauvais endroit dans la phase de compilation - il aurait dû être sous compiler les Sources , mais se retrouve dans le Copy Bundle Resources

5
répondu Sean Dong 2015-03-31 21:10:35

Ce problème ne semble pas devenir obsolète.

j'ai eu le même problème avec Xcode 8 et l'ai résolu similiar comme smilebot :

  1. ouvrez votre fichier storyboard comme" code Source "dans Xcode:

  2. rechercher la classe à laquelle se réfère et supprimer le bit entier qui dit

customClass= "UnrecognizedClassName"

  1. Ouvrez à nouveau votre fichier storyboard en tant que" interfacebuilder - storyboard " et reconstruisez votre application.
4
répondu jaymgee 2017-05-23 12:34:41

non seulement dans les paramètres du projet, mais aussi dans les paramètres de la cible, vous devez ajouter les options-all_load-ObjC..

Core-Parcelle: Inconnue catégorie CPLayerHostingView dans Interface Builder fichier

3
répondu S.P. 2017-05-23 11:55:03

il suffit d'enlever le MyClass.m et .h et les ajouter à projet est de travailler pour moi.

3
répondu yebw 2012-02-01 03:48:27

j'avais 'favoritesbutton de classe inconnue dans le fichier Interface Builder' et je l'ai retracé jusqu'à une scène de livre d'histoires où le bouton en question avait une fausse classe personnalisée de" favoritesbutton " dans le champ de classe au sommet de l'Inspecteur D'identité. Je voulais mettre cette valeur dans le champ suivant: étiquette D'identité.

changer ceci en" UIButton " a résolu le problème.

3
répondu Paul Finger 2012-06-11 22:51:00

J'ai rencontré ça à Swift.

Déplacement de l' .XIB file dans la Base du projet.le dossier lproj s'est débarrassé de cette erreur.

2
répondu jaime 2014-08-14 03:35:23

j'ai fait apparaître 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'utilité et a été initialement construit sous Xcode 3.

pour gagner du temps, j'ai copié les vues main et Flipside de l'iPhone à travers des noms appropriés sur L'application universelle. J'ai connu "l'Inconnu de la classe de x dans Interface Builder fichier d'erreur". Dans mon cas, ce n'était rien dans les fichiers ou les cibles XIB.

j'avais aussi copié aaLuminate-Info.fichier plist across pour d'autres raisons - il y avait une ancienne clé "Main nib file base name" définie à MainWindow.

dès que j'ai supprimé cette clé il a corrigé le problème!

1
répondu aarthur 2012-01-06 09:30:27

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 sur les fichiers source du même nom du projet de travail. J'ai aussi copié mon fichier MainStoryBoard qui cherchait mon Controller RootViewController. Cependant, lorsque j'ai supprimé le RootViewController original et ensuite ajouté dans le RootViewController du produit précédent, évidemment L'opération Add Files n'a pas "vérifié" le zone cible comme suggéré ci-dessus. En vistant tous les newley importés".m " dossiers et en s'assurant que la boîte de membre cible a été cochée, tout allait bien. Je pense que ce qui se passait était que le fichier storyboard cherchait une classe qui avait été "exclue" du lien parce que l'adhésion cible n'était pas contrôlée. En s'assurant que les fichiers requis pour la cible sont ainsi désignés dans la composition cible de l'inspecteur de fichiers a fait le tour. Merci Pat! (voir ci-dessus)

1
répondu Don 2012-02-21 22:53:40

Dans mon cas, c'était parce que j'ai déclaré une sous-classe d'une sous-classe d'une UITableView cellule de la .la déclaration des deux sous-classes était identique .h file), mais a oublié de faire une implémentation vide de cette deuxième sous-classe dans le .m de fichier.

n'oubliez pas de mettre en œuvre une sous-classe d'une sous-classe que vous déclarez dans le .h fichier! cela semble simple, mais facile à oublier parce que Xcode le fera pour vous si vous travaillez avec une classe par .h./m de fichier.

1
répondu horseshoe7 2012-03-16 17:20:02

j'ai eu "l'Inconnue de la classe RateView dans Interface Builder" où RateView était une sous-classe de UIView. J'avais laissé tomber un uivi sur ma scène de Storyboard et changé le champ Custom class en RateView. Encore, cette erreur est apparu.

pour debug, j'ai changé le nom de ma classe en RateView2 et j'ai changé toutes les références pour correspondre sauf le champ Custom class de L'UIView. Le message d'erreur apparaît toujours comme avant avec RateView comme la classe manquante. Cela a confirmé que le le message d'erreur était lié à la valeur du champ de classe personnalisée. J'ai changé cette valeur en RateView2 et le message d'erreur en "Unknown class RateView2 in Interface Builder". Les progrès de toutes sortes.

enfin, j'ai inspecté les fichiers de code source eux-mêmes dans L'Inspecteur des fichiers. J'y ai découvert que le fichier source (que j'avais copié à partir d'un tutoriel) n'était pas associé à ma cible. En d'autres termes, il n'avait pas de membres cibles. J'ai coché la case qui a fait le catégorie du fichier de code source d'un membre de l'application cible et le message d'erreur a disparu.

1
répondu Robert White 2013-04-11 21:53:46

dans mon cas, j'avais supprimé une classe appelée" viewController "sans réaliser qu'elle avait été sélectionnée avec l'inspecteur d'identité du storyboard (sous "Custom Class" en haut).

il vous suffit de sélectionner la bonne classe pour le contrôleur de vue dans le champ Custom Class de votre inspecteur d'identité ou d'ajouter une nouvelle classe à votre projet et de sélectionner celle-ci comme votre classe Custom.

a marché pour moi!

1
répondu Tim 2013-04-30 00:23:23

j'ai ajouté le fichier sous Build Phase in Targets et le problème a été résolu. Pour les étapes pour ajouter le fichier, voir ma réponse à:

Apple Mach-O Linker error (APActivityIcon)

1
répondu Jamal Zafar 2017-05-23 12:26:23

cela m'a rendu un peu fou et aucune des suggestions ci-dessus ne m'a aidé à me débarrasser de l'erreur. Heureusement, je n'avais qu'un seul objet IB dans la classe, alors je l'ai simplement supprimé et je l'ai ajouté avec la même classe spécifiée. Erreur de s'en alla...

1
répondu Jdizzle Foshizzle 2013-09-10 16:21:29