web-dev-qa-db-fra.com

Xcode 6 Bug: classe inconnue dans le fichier Interface Builder

Je suis passé à Xcode 6 beta 4 et maintenant, mon application se bloque continuellement avec le message

Classe X inconnue dans le fichier Interface Builder.

Il se bloque car Xcode ne peut apparemment pas trouver les classes personnalisées que j'ai liées dans mon Storyboard, mais il indique qu'elles sont correctement liées dans l'interface Xcode.

Je suis certain que tout est lié correctement. Ma seule autre option peut être de supprimer le fichier de storyboard en entier et de recommencer à zéro, car il pourrait être corrompu.

Edit: Je voudrais aussi ajouter que j'ai essayé de nettoyer, de réinitialiser le simulateur, de jouer avec les phases de construction, etc. Cela ne fonctionne pas.

552
Epic Byte

J'ai résolu ce problème en tapant la question. Je pensais répondre à ma question et la laisser ici à quiconque pourrait être confronté à ce problème lors de l'utilisation de Xcode 6 beta 4.

Pour résoudre ce problème, vous devez sélectionner chacun de vos objets de classe personnalisés dans Storyboard (cela inclut toutes les vues personnalisées, même les contrôleurs de vue personnalisés eux-mêmes).

Ensuite, avec ces objets sélectionnés, ouvrez l'inspecteur d'identité et sous "Classe personnalisée", vous devriez voir l'option Module. Cliquez à l'intérieur de la zone de texte Module et appuyez sur entrée.

C'est tout! Le module actuel de tous mes objets personnalisés doit avoir été défini de manière incorrecte de manière interne dans Xcode 6 beta 4. Mais l'inspecteur n'en avait aucune indication visuelle.

Notez que si appuyer sur entrer dans la zone de texte Module ne fonctionne pas, essayez de sélectionner la flèche à droite, sélectionnez manuellement votre module actuel, puis effacez la zone de texte et appuyez sur entrée. Vous pouvez également essayer d'appuyer sur Entrée dans la zone de texte de la classe (bien qu'il s'agisse généralement de résoudre un problème différent).

Voici une image pour rendre les choses plus claires: enter image description here

1350
Epic Byte

Parfois, Xcode a manqué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">
96
ChikabuZ

J'ai eu ce problème après avoir renommé une classe Swift. Résolu en utilisant la directive @objc:

@objc(ForumTopicListViewController) class ForumTopicListViewController
68
user1760527

Cela a fonctionné pour moi ..

Vérifiez votre source compilée, que ce fichier (par exemple, ViewController.m) soit ajouté ou non. Dans mon cas, le fichier ViewController n’a pas été ajouté, ce qui me donnait l’erreur.

enter image description here

53
mavericks

Cela peut arriver dans n'importe quel Xcode supérieur à 6.0. Cela m'est arrivé après avoir renommé certaines classes ViewController dans le projet Swift (mais je suppose que cela se produira également avec Obj-C). Il vous suffit d'ouvrir le générateur d'interface, d'accéder à l'inspecteur d'identité de ViewController dont la classe a été renommée, de sélectionner la classe et d'appuyer sur Entrée. Cela réaffectera la classe renommée à ViewController sélectionné et réinitialisera également la valeur du module qui sera perdue après avoir renommé la classe.

Mise à jour pour Xcode 8.1 (probablement aussi 8.0):

Xcode 8.1 vient de planter. Simplement et ennuyeux, ça plante et n'imprime rien. Je poursuivais ce crash fantôme pendant une heure pour découvrir que c'était exactement la même chose: une classe non assignée dans IB. Si vous rencontrez des plantages fantômes, vérifiez d'abord dans IB que les classes non attribuées sont les premières.

43
jovanjovanovic

Projet avec plusieurs cibles

Dans mon cas, je travaille sur un projet avec plusieurs cibles et le problème "hériter de la cible" n'a pas été vérifié. La sélection de "hériter de la cible" a résolu mon problème

 enter image description here

43
Muhammad Nayab

Parfois, le contrôleur que vous fournissez perd son adhésion cible de l'application en cours. Dans ce cas, appuyer sur Entrée dans le champ "Module" ne fera rien. Accédez au contrôleur et assurez-vous que l'appartenance à la cible est définie sur l'application actuelle.

31
Furqan Khan

Ma réponse: définir le module personnalisé égal au nom du pod personnalisé (dans mon exemple - nom de classe personnalisé) comme sur la capture d'écran jointe

Cette solution concerne un cadre cas spécifique: for personnalisé vues à partir de Pod (ou Carthage). 

Infrastructure: XCode8, Swift3

 enter image description here

27
Tamara

Je l'ai corrigé en faisant exactement le contraire de ce que ChikabuZ avait suggéré (merci de l'avoir signalé, cependant). Dans le fichier de scénario, trouvez ceci:

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

et le remplacer par ceci:

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

Je n'arrive pas à croire combien d'heures je perds à résoudre des bugs dans le compilateur Swift et Xcode 6

15
Orlin Georgiev

Sélection de la Module appropriée pour mon Custom Class J'ai résolu ce problème. 

C'est ici :

 enter image description here

13
roy

J'ai fait face à ce problème dans Xcode 8 , pour le résoudre, j'ai dû modifier le storyboard dans l'éditeur de texte.

En général, recherchez votre contrôle et supprimez customModule et customModuleProvider de l'entité de contrôle.

A fait un tour pour moi.

13
George Maisuradze

Vérifiez si votre classe a le droit Adhésion cible .

9
Jakub Truhlář

J'ai eu le même problème.

Dans mon cas, Xcode n'ajoutait pas ma classe personnalisée à: Target> Build Phase> Compile Sources.

Je vous recommande donc de vérifier si votre CustomClass.m est là.

 enter image description here

J'espère que ceci vous aide.

9
rcmstark

J'ai rencontré ce problème dans Xcode 6.1 lorsque j'ai supprimé Main.storyboard, le fichier LaunchScreen.xib et les classes ViewController par défaut de mon projet.

Je l'ai corrigé en supprimant les entrées Launch Screen File et Main Interface de Info.plist

9
Vinay Jain

J'ai googlé partout pour cela. Aucune des réponses ne fonctionne pour moi avant que je rencontre un mec qui m'a demandé de déplacer mon dossier de projet sur le bureau. Cela a juste fonctionné automatiquement. Apparemment, si vous avez votre dossier de projet trop en profondeur, XCODE se brise réellement. 

8
VBaarathi

J'ai résolu ce problème en ouvrant mon fichier de storyboard en tant que code source et en utilisant la commande-F pour rechercher ma classe inconnue et supprimer la classe personnalisée qui lui était associée.

7
Wraithseeker

Ces étapes fonctionnent pour moi. 

1) Effacer les données dérivées.
2) Supprimer les fichiers .h et .m 
3) Créez à nouveau des fichiers .h et .m

7
ARWIN

Ma solution (Xcode 8.1 Swift 3.0):

Classe inconnuexxxdans le fichier Interface Builder.

Ouvrez StoryBoard en tant que code source et recherchezxxx. Supprimer l'attribut qui contient la valeurxxx. Construire et exécuter.

6
ibrahimyilmaz

J'ai résolu ce problème en tapant le nom du module (malheureusement, la liste déroulante ne montrera rien ...) dans la classe personnalisée de l'inspecteur d'identité pour tout le contrôleur de vue et les vues.

Vous devrez peut-être également indiquer le fournisseur cible. Pour atteindre cet objectif, vous pouvez ouvrir le scénario en mode code source et ajouter l'attribut "customModuleProvider" dans les accolades ViewController et View. 

6
Teng Long

Ce que @gfrs a dit est correct, vous devez configurer le module. Cependant, j’ai déjà eu un problème avec le fait que ma classe ne figurait pas dans la liste déroulante Class. Finalement, j'ai supprimé le fichier Swift, redémarré Xcode et recréé le fichier. Enfin, la classe était répertoriée et pouvait être utilisée dans Storyboard.

Regardez aussi cette réponse , qui semble résoudre le «vrai» problème que j'ai rencontré.

6
bouke

Dans mon cas, j'ai ajouté un indicateur -ObjC à Other Linker Flags dans les paramètres du projet pour le faire fonctionner. J'ai aussi essayé avec -all_load flag et cela a bien fonctionné aussi.

 enter image description here

4

Dans mon cas, class référencé dans Storyboard/xib n'avait pas Target Membership défini.

Pour résoudre ce problème, attribuez aux fichiers .h et .m de cette classe la même appartenance à la cible que vos autres classes.

No target membership set.

3
pkamb

Activer Inherit Module From Target a pris le bon module cible. Cela a résolu le problème.

 enter image description here

3
Arnab Hore

J'ai fait face au problème lorsque j'ai porté le storyboard d'un projet Swift dans un projet Objective-c, remarquant la réponse de vvkuznetsov , les deux projets utilisant le même identifiant. I "Produit -> Nettoyer" et appuyez sur la touche Entrée dans le champ de texte Module et Classe. le problème a disparu. 

2
xhg

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.

A l'aide de 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 fichier .__ (cela affichera l'inspecteur de fichier à droite avec les informations du 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 mentionnée.

2
Jignesh Kalantri

Ma solution était de supprimer @objc de la définition de classe personnalisée.

2
danidarko

Mon problème était une erreur d'utilisateur. J'avais un UIView générique dans mon scénario et dans la section Classe personnalisée de l'Inspecteur de l'identité, j'avais accidentellement changé le nom d'UIView en charabia.

Tout ce qu’il a fallu réparer, c’était de revenir à UIView.

1
Scooter

La solution était différente pour moi. Vous devez ajouter le fichier .m de la classe aux sources compilées de la phase de construction de la cible. 

J'espère que cela t'aides!

1
Ruud Visser

J'ai eu ce problème après avoir ajouté une nouvelle cible, puis créé une nouvelle classe à l'aide de la boîte de dialogue 'Nouveau fichier', mais échoué par erreur à vérifier la nouvelle cible ainsi que la cible d'origine dans la boîte de dialogue de création. cible d'origine. La solution consistait à supprimer les fichiers source (supprimer uniquement la référence), puis à les rajouter en utilisant "Ajouter des fichiers", en vérifiant cette fois les deux cibles. 

1
JulianSymes

Ce qui ne fonctionnait que pour moi, c’est d’ajouter le nom du module au fichier xib ... 

Sooo, les fichiers xib ressemblent à ceci:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

HORRIBLE solution à mon avis, mais c’est soi-disant comment Apple veut que nous le fassions maintenant. 

Cette question montre 3 solutions de contournement possibles dans la version bêta 4 ... apparemment, Apple n’a pas été très utile dans cette situation, selon certains, parce qu’ils l’appellent "Travailler comme prévu". 

1
Steven Hernandez

J'ai eu le même problème avec Xcode Version 6.1 (6A1052d). Je pense que le problème apparaît si vous avez renommé votre projet App/Xcode.

Ma solution consistait à ajouter manuellement le nom du module dans le constructeur d'interface.

1
patrickS

Sélectionnez votre fichier de classe inconnu, ouvrez l'onglet d'inspecteur de fichier, vérifiez votre nom de cible dans Target Membership. Voilà.

1
Nix Wang

Swift 3 solution.

Tout cela n'a pas fonctionné.

  1. Cliquer sur Module dans le volet de droite ne fonctionnait PAS.
  2. L'ajout de @obj n'a PAS fonctionné.
  3. Le redémarrage n'a pas fonctionné.
  4. Déplacer vers le bureau lorsque xcode rompt pour un chemin plus long ne fonctionne PAS ....

Cela a finalement fonctionné.

Juste créez un nouveau répertoire et créez un nouveau projet à l'intérieur de celui-ci. Ajoutez les fichiers sauf Main.sotryboard.

Maintenant, copiez les contrôleurs de vue du projet précédent et collez-les dans le nouveau Main.storyboard.

Voila! Cela marche.

0
mythicalcoder

Mon problème était lié à un framework de podfile (en particulier le "BWWalkthrough"). Aucune des solutions ci-dessus n'a fonctionné pour moi, et peu importe comment j'ai essayé, je ne pouvais pas faire en sorte que le module pointe vers mon application.

Ce qui a finalement fonctionné pour moi a été de supprimer la bibliothèque en tant que podfile et de l’ajouter directement à mon projet en tant que bibliothèque statique. Tout était pour moi après cela. Pas tout à fait sûr de ce qui était "cassé" avec l'implémentation de pod de la classe.

0
Simon

Je suis un utilisateur PyObjC et j'avais ma sous-classe NSView dans son propre fichier. Pour moi, ce problème a été résolu par le déplacement de la sous-classe NSView de son propre fichier dans mon fichier AppController.py. C'est le fichier qui contient le contrôleur d'application.

0
user1766438

J'ai eu le même problème, mais pas la même solution.

Le dossier du projet était un peu corrompu, je devais donc copier le dossier de mon projet dans un autre dossier, par exemple votre bureau, puis ouvrir le projet.

Quand il s’ouvrira, allez dans votre projet de création d’interface et vous verrez qu’il reconnaît votre script. Ensuite, vous cliquez bien sur le nom de votre script et appuyez sur Entrée, vous verrez que l’entrée du module le remplira automatiquement.

Et cela fonctionnera comme un charme! :RÉ

0
Jippe Joosten

Pour moi, j'utilise Xcode7 + Swift2

Résolu ce problème en vérifiant mon code, j'ai cette ligne dans mon viewController:

 self?.navigationController?.pushViewController(vc, animated: true)

Ensuite, j'ai réalisé que navigationController n'était pas connecté à la page de détail. Donc, si vous installez un nouveau ViewController avec un ID personnalisé, mieux vaut le vérifier.

0
Chong Guo

J'ai rencontré un problème lorsque j'ai créé un projet avec le même nom qui existait déjà dans mon répertoire de projets (bien qu'il ait été supprimé il y a quelque temps). J'ai écrit ma solution ici https://stackoverflow.com/a/27763697/1654692

0
vvkuznetsov

Cela a fonctionné pour moi quand rien sinon a fait. Depuis le répertoire du projet dans le terminal:

[~/Developer/MyProject] grep -rn ViewController * | grep -i xib 

Ouvrez les fichiers correspondants en tant que code source dans Xcode et modifiez toutes les instances de ViewController selon vos besoins. Dans mon cas, le fichier que je devais ouvrir en tant que source était Main.storyboard et j'ai changé les instances de ViewController en DetailViewController.

J'ai supprimé deux fichiers de Xcode et de main.storyboard, ce qui, selon moi, a été à l'origine de ce problème.

0
N R

Cela m'est arrivé parce que ma classe était marquée avec @objc et qu'elle ne pouvait pas trouver le module dans le storyboard. Supprimer @objc corrige le problème

0
aryaxt

J'ai eu le même problème avec Xcode 6.3 lorsque j'ai ajouté des fichiers à "myapp" ..__ C'est parce que j'ai choisi "créer une référence de dossier" au lieu de "créer des groupes". option.Et le problème corrigé.

0
wj2061

C'est vraiment bizarre quand XCode 10 s'est arrêté pour "raffiner le débogage".
Dans mon cas, j’ai paramétré UITableViewDelegate et UITableViewDataSource avec Storyboard et j’ai oublié d’implémenter les méthodes requises.
Je voulais juste d'abord tester la vue, avant d'implémenter ces méthodes, puis planter! XCode 9, mettra en garde sur ces méthodes, mais XCode 10, a vraiment rendu mon code lent, pas sur celui-ci, les autres personnes ayant traversé ce "doute d'erreur".
J'espère que cela aidera quelqu'un.
Merci

0

dans mon cas, j'ai configuré l'application en tant qu'application universelle, donc xcode crée deux storyboards. Mais je n'utilisais que (conçu) uniquement des storyboards pour iPhone. et essayer d'exécuter une application sur iPad.pour résoudre le problème, il suffit de créer une application comme pour iPhone et fonctionne parfaitement. 

0
bLacK hoLE

Pour moi, le problème était que je faisais référence à une classe personnalisée dans le storyboard (qui correspond à un fichier .h), mais je n'avais pas de commande @implementation dans le fichier .m. 

0
theDuncs

Cela m'est arrivé parce que mon projet s'appelait "ä, ü, ö"

0
SwiftNewling

N'utilisez pas d'espaces dans le nom du projet, sinon la classe personnalisée ne trouvera pas vos propres classes.

0
bob woodwind

Je jouais avec la classe de printemps. Et cette erreur m'est arrivée parce que j'ai utilisé le dossier comme référence lors du déplacement de toute la classe du dossier dans le projet au lieu de créer des groupes. Donc c'était ma solution, n'utilisez pas le dossier comme référence mais créez des groupes.

0
Goran Jakovljevic

J'ai rencontré un tel problème sur Xcode 6 lorsque j'ai supprimé les fichiers ViewController.h et ViewController.m déjà inclus de mon nouveau projet basé sur une vue, et supprimé la scène liée à cette classe du storyboard. Ainsi, si vous essayez d’accéder à Fenêtre -> Projets -> votre_projet et supprimez les données dérivées, tout ira bien.

0
JAHelia

Dans mon cas, le problème était dû au fait que notre scénario principal soit défini comme écran de lancement et que je reçois une erreur de console (pas de blocage) au démarrage de l'application pour chaque contrôleur de vue personnalisé référencé dans le scénario.

Nous avions couvert XIBs et lancé des images sur des story-boards et je n'avais pas encore réussi à faire fonctionner l'écran de lancement à nouveau. Quand j'ai enfin eu le temps de créer un story-board de base, sans aucun contrôleur de vue personnalisé (ce qui n'est pas autorisé), ces erreurs de console ont cessé d'apparaître.

0
Eric McNeill

Dans certains cas, le ViewController.h/m où dans une lib. Les projets sont toujours générés, mais depuis Xcode 6.3, l'erreur ci-dessus a été affichée au moment de l'exécution. Remettre les deux fichiers dans le projet a résolu le problème.

0
OnTwoWheels