"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.
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.
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é.
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.
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"
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
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
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">
aller pour construire des Phases-> compiler des Sources et ajouter votre nouveau .m fichiers.
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.
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
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
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
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.
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:.
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
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];
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
.
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
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 :
-
ouvrez votre fichier storyboard comme" code Source "dans Xcode:
-
rechercher la classe à laquelle se réfère et supprimer le bit entier qui dit
customClass= "UnrecognizedClassName"
- Ouvrez à nouveau votre fichier storyboard en tant que" interfacebuilder - storyboard " et reconstruisez votre application.
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
il suffit d'enlever le MyClass.m et .h et les ajouter à projet est de travailler pour moi.
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.
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.
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!
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)
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.
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.
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!
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 à:
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...