Même si Interface Builder en a connaissance 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 compile la classe directement dans la cible d'application.
Réponses:
Malgré l' erreur « Classe inconnue MyClass dans le fichier Interface Builder » imprimée au moment 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 .xib) sont chargées au moment de l'exécution, elles
MyClass
sont référencées à l'aide d'une chaîne, mais l'éditeur de liens n'analyse pas la fonctionnalité du code, juste l'existence du code, donc il ne le sait pas. Puisqu'aucun autre fichier source ne fait référence à cette classe, l'éditeur de liens optimise sa disparition lors de la création de l'exécutable. Ainsi, lorsque le code d'Apple tente 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 Objective-C auront des
-all_load -ObjC
drapeaux définis par défaut, qui conserveront tous les symboles. Mais j'avais commencé avec une cible C ++, et je n'avais pas ça. Néanmoins, j'ai trouvé un moyen de contourner ce problème, ce qui maintient l'éditeur de liens agressif.Le hack que j'utilisais à l'origine était d'ajouter une routine statique vide comme:
qui ne fait rien, mais que j'appellerais une fois, comme:
Cela forcerait l'éditeur de liens à conserver la classe entière, et l'erreur disparaît.
Comme jlstrecker l'a souligné dans les commentaires, nous n'avons pas vraiment besoin d'ajouter une
_keepAtLinkTime
méthode. Il suffit d'appeler un téléphone existant, tel que:fait l'affaire (tant que vous dérivez d'un
NSObject
).Bien sûr, vous pouvez l'appeler à 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 pensant qu'il
MyClass
est utilisé quelque part afin qu'il ne soit pas si agressif pour l'optimiser.Xcode 6.3.2 et Swift 1.2
Définition rapide de la vue. Assurez-vous de passer outre
init(coder aDecoder: NSCoder)
. Définition Objective-C du contrôleur de vue. Et, une plume dans un poirier.Ajoutez le nom du module à l'inspecteur de détails Nib où vous choisissez votre classe.
la source
MyClass
. Appelez simplement une méthode dont il hériteNSObject
, comme+class
.MyClass.m
dans la section Appartenance à la cible de l'inspecteur de fichiers.J'ai corrigé cela dans le sens de ce que Laura a suggéré mais je n'avais pas besoin de recréer les fichiers.
À l'aide de XCode 4, dans le Navigateur du projet , sélectionnez le fichier .m qui contient la classe dont il se plaint
Allez dans Affichage-> Utilitaires-> Afficher l'inspecteur de fichiers
(cela montrera l' inspecteur de fichiers à droite, avec ces informations de 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 fait obtenir l'erreur que vous avez mentionnée.
la source
Cela n'a vraiment rien à voir avec Interface Builder, ce qui se passe ici, c'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
-all_load -ObjC
indicateurs à laOther Linker Flags
clé des paramètres de génération du projet (et éventuellement de la cible).Puisque 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 l'indicateur -ObjC, et nous devons également forcer l'inclusion de tous nos objets à partir de notre bibliothèque statique en ajoutant l'
-all_load
indicateur de l' éditeur de liens. Si vous sautez ces indicateurs tôt ou tard, vous rencontrerez l'erreurunrecognized selector
ou obtiendrez d'autres exceptions telles que celle que vous avez observée ici.la source
-ObjC
drapeau le fixait dans mon cas.-ObjC
est suffisante pour résoudre le problème.J'ai rencontré ce problème aujourd'hui en utilisant Swift.
J'ai changé une classe
Model.h + Model.m
en aModel.swift
. Cet objet a été utilisé dans Interface Builder avec leclass = Model
.Dès que j'ai remplacé l'objet, la classe ne pouvait plus être chargée.
Ce que je devais faire était de changer la référence de classe dans IB de:
à
Vous le trouverez
<TARGETNAME>
dans les paramètres de construction. C'est également le nom qui apparaît dans votre Swift-Header généré:#import "TARGETNAME-Swift.h"
la source
Module
nom était juste là dans le menu déroulant. C'était le nom de mon application.Allez dans le "ProjectName", cliquez dessus, puis allez dans l'onglet "Build phases", puis cliquez sur le "compile sources", puis cliquez sur le bouton "+", une fenêtre apparaîtra, choisissez "MyClass". m "puis cliquez sur" ajouter ",
Générez le projet et exécutez-le, le problème sera sûrement résolu
la source
C'est un problème de cache Xcode4, supprimez simplement tous les dossiers sous / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /
De plus, si vous avez le même problème de test sur votre iPhone, supprimez l'ancienne application avant de l'exécuter ...
Bonne chance. Pascual
la source
Parfois, IBuilder manquait
customModule="AppName" customModuleProvider="target"
Pour le corriger, ouvrez le storyboard en tant que code source et remplacez cette ligne:
pour ça:
la source
customModule="MyFrameworkName"
. Énorme +10Mon cas - En essayant d'utiliser une classe à partir d'un cadre rapide dans mon projet d'objectif c, j'ai eu cette erreur. La solution consistait à ajouter un module (framework rapide) de la classe dans Interface builder / Storyboard comme indiqué ci-dessous. Rien d'autre
la source
Allez dans Build Phases-> Compile Sources et ajoutez vos nouveaux fichiers .m.
la source
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é falsifié dans le fichier storyboard. Si vous ne reconnaissez pas le fichier de classe dans l'erreur, essayez ceci:
1) ouvrez votre projet en sublime ou dans un autre bon éditeur. Recherchez la classe à laquelle vous faites référence. 2) Retirez tout le bit qui dit
3) enregistrez-le. 4) revenez à xcode et nettoyez le projet, et essayez de l'exécuter maintenant.
travaillé pour moi.
la source
customClass="MyCla"
). Au lieu de supprimer l'affectation de classe personnalisée, il était prudent pour moi de simplement mettre dans la classe que j'avais l'intention d'utiliser en premier lieu :)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 stupide pour le voir ... ainsi les réponses tournent autour soit d'alerter l'éditeur de liens de l'existence de la classe ou créer un hack pour «forcer» l'exister ..
mon problème se produit lorsque ce message parle d'une classe inexistante ... donc un exemple serait que je revienne à une ancienne révision git qui n'a aucune connaissance d'une certaine classe .. pourtant le compilateur se plaint que ladite classe ne fait pas '' t existe ..
Solution?
tu devrais être bon pour aller après
la source
La meilleure façon de supprimer l'erreur est la suivante: 1) Sélectionnez le fichier de classe (.m) 2) Sous " Appartenance cible ", "cochez" l'entrée Nom du projet
la source
J'ai corrigé cela en copiant le texte de mes class.h et .m, en supprimant ces fichiers de classe du projet et en créant de nouveaux fichiers class.h et .m avec le même nom en utilisant "Ajouter un fichier". Ensuite, j'ai recopié le code dans les nouveaux fichiers, et tout a très bien fonctionné. D'une manière ou d'une autre, les fichiers n'étaient pas correctement liés lors de leur création. Je n'ai pas eu besoin d'utiliser de drapeaux de l'éditeur de liens après cela.
la source
J'ai finalement résolu ce problème, j'avais oublié d'ajouter le code suivant à mon fichier .m:
Donc, cela était dû au fait que j'avais créé un espace réservé @interface pour ma cellule de tableau, qui avait une connexion à un élément dans le fichier .xib, mais il y a un bogue dans Interface Builder où si aucune @implementation n'est spécifiée pour une classe, il ne peut pas le trouver.
J'avais suivi toutes les étapes des autres forums pour voir 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 séparés nommés de la même manière que les interfaces, mais rien n'a fonctionné jusqu'à présent.
PS: d'après mon expérience, peu importe si les noms des fichiers .h / .m sont différents des noms de @interface. J'ai plusieurs fichiers contenant plus d'une @interface et ils fonctionnent bien.
PPS J'ai une explication plus détaillée des raisons pour lesquelles UITableViewCell et UICollectionViewCell provoquent cette erreur sur https://stackoverflow.com/a/22797318/539149 ainsi que la façon de la révéler au moment de la compilation en utilisant registerClass: forCellWithReuseIdentifier :.
la source
Cela se produit car le .xib a un lien périmé avec l'ancien délégué d'application qui n'existe plus. Je l'ai fixé comme ceci:
la source
ajoutez simplement le code ci-dessous au début de la méthode appdelegate applicatoindidfinishlanching, cela fonctionnera bien
la source
J'ai essayé cela, et d'autres, les réponses répertoriées sur ce site, aucune ne l'a trié pour moi. Ces commentaires (de http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) ont aidé:
Le simple fait de supprimer cette dernière ligne ne le résout malheureusement pas, se plaignant qu'il y a le mauvais nombre 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
.la source
Dans mon cas, j'ai XCode6, le fichier de classe spécifié .m se retrouve au mauvais endroit dans la phase de construction - Il aurait dû être sous Compiler les sources , mais se retrouver dans le
la source
Non seulement dans les paramètres du projet, mais dans le paramètre cible, vous devez également ajouter des indicateurs -all_load -ObjC ..
Core-Plot: classe inconnue CPLayerHostingView dans le fichier Interface Builder
la source
Ce problème ne semble pas obsolète.
J'ai eu le même problème avec Xcode 8 et l' ai résolu de la même manière que smilebot :
Ouvrez votre fichier de storyboard en tant que "code source" dans Xcode:
Recherchez la classe à laquelle vous faites référence et supprimez tout ce qui dit
customClass = "UnrecognizedClassName"
la source
Il suffit de supprimer les MyClass.m et .h et de les ajouter à nouveau au projet est un travail pour moi.
la source
J'avais 'FavouritesButton de classe inconnue dans le fichier Interface Builder' et je l'ai suivi jusqu'à une scène de livre de contes où le bouton en question avait une classe personnalisée fausse de "favouritesButton" dans le champ Classe en haut de l'inspecteur d'identité. Je voulais mettre cette valeur dans le champ suivant: étiquette d'identité.
Changer cela en "UIButton" a résolu le problème.
la source
J'ai rencontré ça dans Swift.
Le déplacement du fichier .xib dans le dossier Base.lproj du projet a supprimé cette erreur.
la source
J'ai rencontré 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 inversée de l'iPhone sur les noms appropriés sur l'application universelle. J'ai rencontré l'erreur «Classe x inconnue dans le fichier Interface Builder». Dans mon cas, il n'y avait rien dans les fichiers ou cibles XIB.
J'avais également copié le fichier aaLuminate-Info.plist pour d'autres raisons - cela avait une ancienne clé "Main nib file base name" définie sur MainWindow.
Dès que j'ai supprimé cette clé, cela a résolu le problème!
la source
Dans mon cas, j'ai eu cette erreur parce que j'avais essayé d'enregistrer 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 recherchait mon RootViewController. Cependant, après avoir supprimé le RootViewController d'origine, puis ajouté le RootViewController du produit précédent, il est évident que l'opération Ajouter des fichiers n'a pas réussi à "cocher" la case cible comme suggéré ci-dessus. En visitant simplement tous les fichiers ".m" importés par newley et en vérifiant que la case d'appartenance cible était cochée, tout allait bien. Je pense que ce qui se passait était que le fichier de storyboard recherchait une classe qui avait été "exclue" du lien parce que l'adhésion cible n'était pas cochée. S'assurer que les fichiers requis pour la cible sont ainsi désignés dans l'appartenance à la cible dans l'inspecteur de fichiers a fait l'affaire. Merci Pat! (voir au dessus)
la source
Dans mon cas, c'est 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é de faire une implémentation vide de cette deuxième sous-classe dans le Fichier .m.
n'oubliez pas d'implémenter une 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.
la source
J'avais "classe inconnue RateView dans Interface Builder" où RateView était une sous-classe de UIView. J'avais déposé une 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 changé toutes les références pour qu'elles correspondent à l'exception du champ Classe personnalisée de l'UIView. Le message d'erreur est toujours apparu comme avant 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 en RateView2 et le message d'erreur a changé en "Classe inconnue RateView2 dans Interface Builder". Des progrès en quelque sorte.
Enfin, j'ai inspecté les fichiers de code source eux-mêmes dans l'inspecteur de fichiers. Là, j'ai découvert que le fichier de code source (que j'avais copié à partir d'un tutoriel) n'était pas associé à ma cible. En d'autres termes, il n'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 a disparu.
la source
Dans mon cas, j'avais supprimé une classe appelée "viewController" ne réalisant pas qu'elle avait été sélectionnée avec l'inspecteur d'identité du storyboard (sous "Classe personnalisée" en haut).
Il vous suffit de sélectionner simplement la classe appropriée pour le contrôleur de vue dans le champ Classe personnalisée de votre inspecteur d'identité ou d'ajouter une nouvelle classe à votre projet et de la sélectionner comme classe personnalisée.
A travaillé pour moi!
la source
J'ai ajouté le fichier Under Build Phase in Targets et le problème a été résolu. Pour les étapes pour ajouter le fichier, voir ma réponse sur:
Erreur Apple Mach-O Linker (APActivityIcon)
la source
Cela m'a rendu fou un peu 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 en utilisant la classe, je l'ai donc supprimé et rajouté avec la même classe spécifiée. L'erreur a disparu ...
la source