web-dev-qa-db-fra.com

Erreur "Classe inconnue <MyClass> dans le fichier Interface Builder" à l'exécution

Même si Interface Builder a connaissance d'un 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 de l'application.

259
jhoule

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 avec l'éditeur de liens, qui ne lie pas une classe car aucun code n'utilise directement.

Lorsque les données .nib (compilées à partir de .xib) sont chargées au moment de l'exécution, MyClass est référencé à l'aide d'une chaîne, mais l'éditeur de liens n'analyse pas la fonctionnalité du code, mais bien l'existence du code, de sorte qu'il ne le sait pas. Comme aucun autre fichier source ne fait référence à cette classe, l’éditeur de liens l’optimise lorsqu’il exécute l’exécutable. Ainsi, lorsque le code 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 les indicateurs -all_load -ObjC définis par défaut, qui conservera tous les symboles. Mais j'avais commencé avec une cible C++ et je n'avais pas cela. Néanmoins, j'ai trouvé un moyen de contourner ce problème, ce qui maintient l'agresseur dans l'éditeur de liens.

Le hack que j'utilisais à l'origine consistait à ajouter une routine statique vide telle que:

+(void)_keepAtLinkTime;

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

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

Cela forcerait l'éditeur de liens à conserver la classe entière et l'erreur disparaîtrait.

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

   [MyClass class];

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

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

Xcode 6.3.2 & Swift 1.2

Définition rapide de la vue. Assurez-vous de remplacer 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 de la pli où vous choisissez votre classe.

218
jhoule

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 XCode 4, dans le Project Navigator , sélectionnez le fichier .m contenant la classe dont il se plaint.

  • Allez dans Affichage-> Utilitaires-> Afficher l'inspecteur de fichier
    (ceci affichera l'inspecteur de fichiers à droite, avec les informations relatives au fichier .m)

  • Ouvrez la section Adhésion 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, ce qui m'a amené à obtenir l'erreur que vous avez mentionnée.

183
Pat

Cela n'a vraiment rien à voir avec Interface Builder, mais 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 ajouter les indicateurs -all_load -ObjC à la touche Other Linker Flags ainsi qu'aux paramètres de construction du projet (et éventuellement de la cible).

Objective-C ne générant qu'un symbole par classe, nous devons obliger l'éditeur de liens à charger les membres de la classe à l'aide de l'indicateur -ObjC. Nous devons également forcer l'inclusion de tous nos objets à partir de notre bibliothèque statique en ajoutant le -all_load drapeau de l'éditeur de liens. Si vous ignorez ces indicateurs tôt ou tard, vous rencontrerez l'erreur de unrecognized selector ou vous obtiendrez d'autres exceptions, telles que celle que vous avez observée ici.

69
Alasdair Allan

J'ai rencontré ce problème aujourd'hui avec Swift.

J'ai changé une classe Model.h + Model.m en un Model.Swift. Cet objet était 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 je devais 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 également le nom qui apparaît dans votre Swift-Header généré: #import "TARGETNAME-Swift.h"

26
Besi

Allez dans le "ProjectName", cliquez dessus, puis allez dans l'onglet "Build phases", puis cliquez sur "Compiler les sources", puis cliquez sur le bouton "+", une fenêtre apparaîtra, choisissez "MyClass. m "fichier puis cliquez sur" ajouter ",

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

20
Subbu

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

De plus, si vous rencontrez le même problème sur votre iPhone, supprimez l'ancienne application avant de l'exécuter.

Bonne chance. Pascual

19
Ignacio Pascual

Parfois, IBuilder manquait customModule="AppName" customModuleProvider="target"

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

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

pour ça:

_<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
_
16
ChikabuZ

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

1) ouvrez votre projet en sublime ou un autre bon éditeur. Recherchez la classe à laquelle vous faites référence. 2) enlever tout le bit qui dit

customClass="UnrecognizedClassName"

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

a travaillé pour moi.

enter image description here

13
smileBot

Mon cas - Essayer d'utiliser une classe à partir d'un framework Swift dans mon projet Objective C, j'ai eu cette erreur. La solution consistait à ajouter le module (structure Swift) de la classe dans Interface builder/Storyboard, comme indiqué ci-dessous. Rien d'autre

enter image description here

13
Dhilip

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

13
Jackie Lee

La meilleure façon de supprimer l'erreur est la suivante: 1) Sélectionnez le fichier de classe (.m) 2) Sous "Adhésion cible", "cocher" = l'entrée du nom du projet

9
Amit B

Je veux juste ajouter cette réponse puisque la plupart sinon la totalité des réponses supposent que la classe existe réellement .. c'est simplement que l'éditeur de liens/compilateur est trop bête pour la voir .. ainsi les réponses tournent autour de l'alerte de l'éditeur de liens vers l'existence de la classe ou créer un hack pour "forcer" exister ..

mon problème survient lorsque ce message parle en fait d'une classe inexistante. Un exemple serait donc de revenir à une ancienne révision git qui a aucune connaissance d'une certaine classe .. pourtant le compilateur se plaint que cette classe n'existe pas ..

solution?

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

vous devriez être bon pour aller après cela

9
abbood

J'ai résolu ce problème 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 portant le même nom à l'aide de "Ajouter un fichier". Ensuite, j'ai collé 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 les drapeaux de l'éditeur de liens après cela.

8
Laura

J'ai finalement résolu ce problème, j'avais oublié d'ajouter le code suivant à mon fichier .m:

@implementation MyTableViewCell

@end

Cela était donc 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 @implementation n'est pas spécifié pour une classe, il ne peut pas le trouver.

Depuis d'autres forums, j'avais parcouru toutes les étapes pour visualiser 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 diviser toutes mes classes en fichiers séparés portant le même nom que les interfaces, mais rien ne fonctionnait jusqu'à présent.

P.S. D'après mon expérience, peu importe que les noms des fichiers .h/.m soient différents de ceux de @interface. J'ai plusieurs fichiers contenant plus d'une @ interface et ils fonctionnent bien.

P.P.S. J'ai une explication plus détaillée de la raison pour laquelle UITableViewCell et UICollectionViewCell causent cette erreur à https://stackoverflow.com/a/22797318/539149 , ainsi que la façon de la révéler lors de la compilation à l'aide de registerClass: forCellWithReuseIdentifier: .

7
Zack Morris

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

[classe myclass];

6
iSpark

Cela est dû au fait que le fichier .xib dispose d’un lien obsolète vers l’ancien délégué d’application, qui n’existe plus. Je l'ai fixé comme suit:

  • Cliquez avec le bouton droit sur le fichier .xib et sélectionnez Ouvrir en tant que> Code source.
  • Dans ce fichier, recherchez l'ancien délégué de l'application et remplacez-le par le nouveau.
6
S B

J'ai essayé ceci, ainsi que d'autres réponses listées sur ce site, dont aucune ne l'a trié pour moi. Ces commentaires (de http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-class-interface-builder-file.html ) ont 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 du constructeur d'interface dans X-code, en cliquant dessus avec le bouton droit de la souris et en choisissant "Voir comme code source". Ensuite, la recherche est venue avec

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

Le simple fait de supprimer cette dernière ligne ne résout malheureusement pas le problème, se plaindre du nombre erroné d'éléments dans le fichier. Vous devez supprimer la ligne correspondante dans la section de lignes située au-dessus de celle-ci, qui fait référence à CustomClass.

5
user776904

Dans mon cas, j'ai XCode6, le fichier .m de la classe spécifiée se trouve au mauvais endroit lors de la phase de construction. Il aurait dû être sous sources de compilation, mais se retrouver dans le Copy Bundle Resources

5
Sean Dong

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 de la même façon que smilebot :

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

  2. Recherchez la classe à laquelle vous faites référence et supprimez le bit qui dit

customClass = "UnrecognizedClassName"

  1. Ouvrez à nouveau votre fichier de storyboard en tant que "interface constructeur - storyboard" et reconstruisez votre application.
4
jaymgee

Non seulement dans les paramètres du projet, mais également dans le paramètre Cible, vous devez également ajouter les indicateurs -all_load -ObjC.

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

4
S.P.

J'avais "Favoris de classe inconnus dans le fichier Interface Builder" et je les ai localisés dans une scène de scénario où le bouton en question comportait une classe personnalisée fictive de "favoris" dans le champ Classe situé 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.

3
Paul Finger

Il suffit de retirer MyClass.m et .h et de les ajouter au projet.

3
yebw

Je suis tombé dessus à Swift.

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

2
jaime

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

Vous devez simplement sélectionner la classe appropriée pour le contrôleur de vue dans le champ Classe personnalisée de votre inspecteur d’identité ou ajouter une nouvelle classe à votre projet et la sélectionner en tant que classe personnalisée.

Travaillé pour moi!

1
Tim

Cela m'a rendu fou pour le moment et aucune des suggestions ci-dessus ne m'a aidé à éliminer l'erreur. Heureusement, je n'avais qu'un seul objet IB utilisant la classe, je l'ai donc simplement supprimé et rajouté avec la même classe que celle spécifiée. L'erreur est partie ...

1
Jdizzle Foshizzle

Cette erreur est survenue 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é à l'origine construite sous Xcode 3.

Pour gagner du temps, j'ai copié les vues principale et inversée de l'iPhone sous 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; l'ancienne clé "Nom de base du fichier principal" était définie sur MainWindow.

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

1
aarthur

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 se trouvait dans le même fichier .h), mais j’ai oublié de faire une implémentation vide de cette seconde sous-classe dans le fichier .h. fichier .m.

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

1
horseshoe7

Dans mon cas, j'ai eu cette erreur parce que j'avais essayé de sauvegarder 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 à partir du projet en cours. J'ai également copié mon fichier MainStoryBoard qui cherchait mon RootViewController. Cependant, lorsque j'ai supprimé le RootViewController d'origine, puis ajouté dans le RootViewController du produit précédent, l'opération Add Files n'a pas réussi à "cocher" la case cible comme suggéré ci-dessus. En consultant simplement tous les fichiers ".m" importés par newley et en vous assurant que la case d'appartenance à la cible était cochée, tout allait bien. Je pense que ce qui se passait, c’était que le fichier de scénarisation cherchait une classe qui avait été "exclue" du lien parce que l’appartenance à la 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 bien fonctionné. Merci Pat! (voir au dessus)

1
Don

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 à l'adresse suivante:

Erreur Apple Mach-O Linker (APActivityIcon)

1
Jamal Zafar

J'avais "Classe inconnue RateView dans Interface Builder" où RateView était une sous-classe de UIView. J'avais déposé UIView sur ma scène Storyboard et changé le champ de classe Custom 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 afin qu'elles correspondent, à l'exception du champ Classe personnalisée de UIView. Le message d'erreur apparaissait toujours comme auparavant avec RateView en tant que 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 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. 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'y avait pas d'adhésion cible. J'ai coché la case qui a fait du fichier de code source de la classe un membre de l'application cible et le message d'erreur a disparu.

1
Robert White

Dans mon cas, la classe n'a pas pu être trouvée car il s'agissait d'une classe définie dans une extension à l'intérieur du cadre, comme ceci:

extension Buttons {
    public class MyButton: UIButton {
        // ...
    }
}

Lorsque j'ai extrait la classe de l'extension, le Storyboard a finalement trouvé la classe (MyFrameworkButton):

extension Buttons {
    public typealias MyButton = MyFrameworkButton
}

public class MyFrameworkButton: UIButton {
    // ...
}
0
Kukiwon

Dans mon cas, la classe UIView personnalisée se trouve dans une infrastructure intégrée. J'ai changé le fichier d'en-tête UIView personnalisé en "projet" en "public" et l'inclure dans le fichier d'en-tête principal.

0
draw

Je continue à avoir cette erreur avec WatchKit maintes et maintes fois, et cela semble être le cas lorsqu'un élément de l'interface utilisateur n'est pas lié à un point de vente dans le code. Je suppose que cela est nécessaire dans WatchKit.

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var table: WKInterfaceTable!
}

Remarque importante: il suffit de connecter l'élément le plus externe. Par exemple, si vous essayez de donner également une connexion à quelque chose dans la table, comme une étiquette dans une ligne, vous obtiendrez une erreur du compilateur disant que la sortie est invalide et ne peut pas être connectée à un contenu répété.

0
Korey Hinton

Beaucoup de réponses ici mais aucune n’était la solution, je l’ai retrouvée dans le storyBoard où le contrôleur avait une classe personnalisée non valide (la classe n’existait pas après que je l’ai renommée)

0
SAFAD

Si le développeur confond le formulaire customModule dans IB, la vue est créée dans la vue UIKit au lieu de la classe personnalisée. C'est un problème important. J'ai donc créé un linter de customModule dans IBLinter. le nom de la règle dans IBLinter est "custom_module". https://github.com/IBDecodable/IBLinter

0
Satoru Fukagawa

J'ai constaté cette erreur lorsque j'ai changé le nom d'une classe, malgré la mise à jour de tous les fichiers .h et .m pertinents. En fin de compte, j'avais raté la mise à jour de la valeur 'customClass' dans les fichiers .storyboard. Cela a résolu le problème.

0
Deepa Dhurka

Après avoir essayé la plupart des suggestions ici sans succès, je viens de renommer ma classe, puis de la renommer manuellement dans le fichier xib (avec open comme code source). Le problème a ensuite disparu.

0
john elemans

J'ai essayé la plupart des solutions que vous avez suggérées ci-dessus, mais en vain. Après avoir lu la solution de user776904, je soupçonnais que j'avais le même problème, car j'avais reconstruit mon application à partir de rien, mais j'avais copié les fichiers xib du projet précédent. Je soupçonnais que le fichier xib contenait une référence à l'ancien projet à l'origine de mon erreur; j'ai donc simplement supprimé mon fichier mainwindow_ipad.xib et l'ai copié dans un nouveau à partir d'un nouveau projet vierge. Cela l'a résolu. Et je n'étais pas assez en forme pour commencer à changer des éléments du fichier xib dans son code source.

0
timv

Dans mon cas, le nom "Custom Class" était mal orthographié. Assurez-vous de rechercher dans votre scénario les classes personnalisées que vous avez définies.

0

Ce problème m'est arrivé lorsque j'ai ajouté une vue de sélecteur, puis que je l'ai supprimée. Au cas où cela aiderait quelqu'un, voici comment j'ai finalement résolu le problème:

  1. Ouvrez Document Outline sur XCODE (vous ne savez pas ce qu'est un document? Je n'ai pas aussi - google it .. :)).

  2. Recherchez la scène qui fait apparaître le message d'avertissement dans la fenêtre de contour du document.

  3. Sur la scène problématique, placez (cliquez) sur Afficher, puis dans la fenêtre Utilitaire (google it), sélectionnez l'onglet Inspecteur Identité et remplacez le nom de la classe personnalisée par UIView par défaut.

C'est ça. :)

0
Yizhar

Dans mon cas, je reçois ce message d'erreur par une erreur très stupide de ma part: sur le constructeur d'interface, je voulais définir l'identifiant d'un UITableViewCell, mais je l'ai tapé accidentellement dans l'entrée 'Custom class' du constructeur d'interface.

J'ai fait des cellules 1000 fois avant ....

0
Tom

À partir du constructeur d'interface/storyboard, il est fait référence à une classe non disponible.

Si le est une classe connue, elle n'est pas liée.

Si le n'est pas une classe ou juste quelques caractères c'est probablement une faute de frappe. Dans ce cas, vérifiez tous les champs du contrôleur de vue pour cette "classe inconnue". Dans l'inspecteur d'identité (le 3ème de gauche dans le bloc "Classe personnalisée" correspond à un champ "Classe" contenant probablement la valeur incorrecte. Normalement, il répertorie le type de champ (UIView/UILabel, etc.).

0
Vincent

Per Apple Documentation

Pour les applications 64 bits et iPhone OS, il existe un bogue lié à l'éditeur de liens qui empêche - ObjC de charger des fichiers objet à partir de bibliothèques statiques ne contenant que des catégories et pas de classes. . La solution de contournement consiste à utiliser les indicateurs - all_load ou - force_load .

En bref, ajoutez - all_load à "autre éditeur de liens" dans votre "Configurer les paramètres" et vous devriez être bon.

http://developer.Apple.com/library/mac/qa/qa1490/_index.html

0
Ben Coffman

Cette erreur "Classe inconnue dans le fichier Interface Builder" au moment de l'exécution survient si vous avez plus d'un StoryBoard et l'un des StoryBoard utilisant le qui n'existe pas réellement.

0
Sid

J'ai eu ce problème quand j'avais créé un nouveau projet avec le même nom et les avais tous les deux exécutés dans le simulateur. J'ai renommé l'un des projets, supprimé l'application dans le simulateur, puis lancé un nouveau nettoyage et une reconstruction.

0
Amelia777

Dans mon cas, j'avais utilisé un scénarimage d'un autre projet. Après avoir examiné le fichier de storyboard xml (par exemple dans TextWrangler), j’ai constaté que l’une des valeurs de l’attribut xml "customModule" pour un contrôleur était erronée (il faisait toujours référence à l’ancien projet). Changer manuellement cela corrigeait le problème.

0
FredL

Dans mon cas, le problème était un lien IBOutlet mort. Une fois que cela a été corrigé, tout était bien à nouveau.

0
Michal Shatz