Bogue Xcode 6: classe inconnue dans le fichier Interface Builder

600

J'ai mis à niveau vers 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 parce que Xcode ne peut pas trouver mes classes personnalisées que j'ai liées dans mon Storyboard mais cela montre qu'elles sont correctement liées dans l'interface Xcode.

Je suis certain que tout est correctement lié. Ma seule autre option peut être de supprimer l'intégralité du fichier de storyboard et de recommencer à zéro car il pourrait être corrompu d'une manière ou d'une autre.

Edit: Je voudrais également ajouter que j'ai essayé de nettoyer, de réinitialiser le simulateur, de jouer avec les phases de construction, etc. Rien de tout cela ne fonctionne.

Octet épique
la source
Copie possible de stackoverflow.com/questions/3416269/…
Bouke
1
@ ImreKelényi Vous avez raison. Cela m'est arrivé encore récemment après avoir fait ce que vous venez de décrire.
Epic Byte
Cela a fonctionné pour moi, stackoverflow.com/questions/1725881/…
vrunoa
C'était une faute de frappe pour moi, le déboguer vers l'élément Control, jusqu'à ce qu'il arrive, sélectionnez; Voir Contrôleur> inspecteur d'identité> Classe personnalisée> Classe. supprimez-le si cette classe n'est pas définie.
conformistes
9
NOTEZ S'IL VOUS PLAÎT! Cette "erreur" peut provenir de différentes origines. Si la réponse acceptée ne fonctionne pas pour vous, descendez et essayez la réponse suivante. La bonne réponse à ma situation était la 5ème réponse.
Jacksonkr

Réponses:

1454

J'ai résolu ce problème en tapant la question. J'ai pensé que je répondrais à ma question et la laisser ici pour toute autre personne qui pourrait rencontrer 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 dans la zone de texte Module et appuyez sur Entrée.

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

Notez que si appuyer sur Entrée dans la zone de texte Module ne fonctionne pas, essayez de sélectionner la flèche vers la droite et sélectionnez manuellement votre module actuel, puis désactivez 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 que cela soit généralement pour résoudre un problème différent).

Voici une image pour rendre les choses plus claires: entrez la description de l'image ici

Octet épique
la source
70
Pour moi, cliquer à l'intérieur de "Module" et appuyer sur Entrée ne fonctionnait pas de manière cohérente, mais sélectionner le champ "Classe" (et appuyer sur Entrée) faisait toujours l'affaire.
Imre Kelényi
2
Pour moi, la cible a été définie correctement, mais la classe ne s'est toujours pas présentée dans IB. J'ai remarqué, cependant, que l '"emplacement" du fichier montrait un chemin "relatif au projet" au lieu de "relatif au groupe". Supprimer la référence de fichier ET le groupe et l'ajouter à nouveau à la racine du projet a fonctionné pour moi.
knl
8
Sensationnel. Merci pour cela, je ne pense pas que j'aurais pu y arriver autrement. Cela a corrigé un problème qui a commencé à se produire après avoir ajouté @objc(...)à l'une de mes classes Swift.
ndbroadbent
12
Ce problème est toujours présent dans XCode 7.2. Cette solution a fonctionné.
Tom Fast
3
C'est toujours un problème dans Xcode 8.3.1 ... une telle honte
Sepehr Behroozi
99

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

Pour le corriger, 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">
ChikabuZ
la source
7
En fait, dans mon cas, j'ai dû supprimer customModuleProvider, puis l'erreur a disparu.
Maciej Swic
3
Guillermo, toujours en cours dans Xcode fin mars!
Ed Manners
3
@MaciejSwic La suppression de l'a également customModuleProviderfait pour moi, merci!
Sakiboy
1
qu'en est-il des fichiers xib?
SleepsOnNewspapers
7
Ça se passe toujours ... ce sont des choses comme ça qui me donnent envie de pleurer :(
Luke
72

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

@objc(ForumTopicListViewController) class ForumTopicListViewController
user1760527
la source
4
Cela l'a corrigé pour moi, j'ai eu @objc class Xet changer pour @objc(X) class Xtravailler.
Joe
1
Vous pouvez également essayer de supprimer vos données dérivées voir stackoverflow.com/questions/24039932/…
user1760527
J'ai eu ce problème après avoir renommé la classe ViewController par défaut à partir du modèle de projet Single View. Je me demande quelle magie a été utilisée pour que la @objc()directive ne soit pas nécessaire pour la classe ViewController "originale" ...
Berend Klein Haneveld
Je vais du côté opposé. J'avais spécifié le nom du module dans le fichier Storyboard mais également ajouté la directive @objc.
WeZZard
1
N'a pas travaillé pour moi. :( La solution du nom de module ne fonctionne pas non plus
mythicalcoder
64

Projet avec plusieurs cibles

Dans mon cas, je travaille sur Project 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

entrez la description de l'image ici

Muhammad Nayab
la source
Merci d'avoir posté ça. Résolu le problème que je voyais très rapidement.
JaredH
J'avais une situation similaire. (XCode 9.4.1) J'ai créé une application iOS appelée FilesTestA, avec une UIView personnalisée appelée MxFileView (composée de MxFileView.swift et MxFileView.xib). J'ai ensuite ajouté une autre cible: un widget Aujourd'hui ("FilesTestAWidget"). Solution pour utiliser MxFileView dans le widget: (1) class = "MxFileView"; (2) cochez "Hériter le module de la cible" (ou décochez-le et entrez manuellement "FilesTestAWidget"); (3) dans la cible de l'application, assurez-vous que MxFileView.swift et MxFileView.xib incluent FilesTestAWidget dans leur adhésion cible.
Kenster999
Cela m'est arrivé sur un nouveau projet à partir du modèle par défaut dans Xcode 10.1 (une seule cible d'application iOS et 2 cibles de test). La case à cocher a été décochée pour tous mes contrôleurs de vue personnalisés (et donc le texte de l'espace réservé était "Aucun"). Après avoir parcouru et coché la case de chaque contrôleur de vue personnalisé dans mon storyboard, le problème a été résolu.
Mason
58

Cela a fonctionné pour moi ..

Vérifiez votre source compilée, si ce fichier (par exemple; ViewController.m) est ajouté ou non, dans mon cas, le fichier ViewController n'a pas été ajouté, ce qui m'a donné l'erreur.

entrez la description de l'image ici

non-conformistes
la source
@CarmenA Vous n'ajoutez que des fichiers '.m' à Compile Sources. C'est vraiment la solution correcte (et unique) pour certains.
Jacksonkr
J'ai essayé plusieurs autres solutions sans succès. Cela a fait l'affaire. Pour une raison étrange, une cible manquait le fichier source qui me convenait.
galactikuh
pour moi aussi .. Arrivé à cause de la résolution de conflits
Eldhose
46

Cela peut se produire 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). Vous n'avez qu'à ouvrir le générateur d'interface, allez à Inspecteur d'identité de ViewController qui a renommé sa classe, sélectionnez la classe et appuyez sur Entrée. Cela va réaffecter la classe renommée à ViewController sélectionné et réinitialiser également la valeur du module qui est perdue après avoir renommé la classe.

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

Xcode 8.1 plante juste. Simplement et de façon ennuyeuse, cela se bloque et n'imprime rien. Je poursuivais ce crash fantôme pendant une heure juste pour découvrir que c'était exactement la même chose - une classe non affectée dans IB. Si vous obtenez des plantages fantômes, vérifiez d'abord IB pour les classes non attribuées.

jovanjovanovic
la source
Merci pour cela. il semble que suite à votre suggestion, Xcode met à jour le module (sous la classe dans IB) de None à Current. Je pense que le problème est que la simple saisie du nom sans appuyer sur Entrée ne déclenche pas une mise à jour du module par Xcode.
rockiesGrizzly
Cela a fonctionné pour moi. J'ai renommé par inadvertance une classe de contrôleur, de sorte qu'elle n'existait évidemment plus lorsque le contrôleur de vue a été chargé.
Litehouse
32

Parfois, le contrôleur que vous fournissez perd son appartenance cible à l'application actuelle. 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 cible est définie sur l'application actuelle.

Furqan Khan
la source
C'était aussi le problème pour moi - plusieurs cibles conduisent à ce que le fichier de classe ne soit accidentellement pas inclus dans la cible que je construisais.
Ryan Kreager
J'ai fusionné des fichiers et ça manque dans l'une de mes cibles, excellente réponse
Benjamin Jimenez
Bon, fusion pbx a cassé les valeurs d'adhésion cibles.
système
32

L'activation a Inherit Module From Targetpris le module cible correct. Cela a résolu le problème.

entrez la description de l'image ici

Arnab
la source
Confirmer. Cela m'a aidé à résoudre le problème.
Chris8447
J'ai généralement ce problème lorsque je convertis un contrôleur de vue d'Objective-C en Swift. Je retaper la dernière lettre et appuyez sur Entrée. Devrait aussi faire l'affaire.
DevNebulae
30

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

Cette solution est pour un cas spécifique : pour les classes de vues personnalisées du framework Pod (ou Carthage ).

Infrastructure: XCode8, Swift3

entrez la description de l'image ici

Tamara
la source
18

Je l'ai corrigé en faisant exactement le contraire de ce que ChikabuZ a suggéré (merci de l'avoir souligné, cependant). Dans le fichier storyboard, recherchez ceci:

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

et remplacez-le par ceci:

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

Je ne peux pas croire combien d'heures je perds pour contourner les bogues dans le compilateur Swift et Xcode 6

Orlin Georgiev
la source
17

Sélection du bon Modulepour mon Custom ClassJ'ai résolu ce problème.

C'est ici :

entrez la description de l'image ici

roy
la source
13

J'ai rencontré 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 customModuleet customModuleProviderde l'entité de contrôle.

A fait un tour pour moi.

George Maisuradze
la source
Hah! Nice hack :)
Vexy
10

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

entrez la description de l'image ici

J'espère que ceci vous aide.

rcmstark
la source
C'est ce qui m'est arrivé et j'ai heureusement trouvé mon chemin! Je venais ici pour répondre mais vous étiez le premier. Merci!!!
Gabriel Piffaretti
9

J'ai rencontré ce problème dans Xcode 6.1 lorsque j'ai supprimé Main.storyboardle LaunchScreen.xibfichier et les ViewControllerclasses par défaut de mon projet.

Je l'ai corrigé en supprimant les entrées Launch Screen Fileet Main InterfacedeInfo.plist

Vinay Jain
la source
9

Vérifiez si votre classe a le droit d' adhésion cible .

Jakub Truhlář
la source
8

J'ai googlé partout pour ça. Aucune des réponses ne fonctionne pour moi jusqu'à ce que je rencontre 1 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 en profondeur dans de nombreux dossiers, XCODE se casse réellement.

VBaarathi
la source
J'ai de nouveau eu ce problème dans Xcode 7 beta 5 depuis que je l'ai eu dans Xcode 6 auparavant. Cette fois, cette méthode fonctionne pour moi.
Jake Lin
1
Dans Visual Studio, il y a un problème similaire. Mais là-bas, nous recevons un message d'avertissement clair disant que le chemin est trop long et que les choses ne peuvent pas être ajoutées ou modifiées. Je ne sais pas si c'est la même chose avec XCODE, mais après cet épisode, je garde tous mes projets dans des documents ou sur le bureau et je n'ai plus jamais eu ce problème. J'ai même donné ce conseil à quelqu'un qui utilise Xamarin Studio et cela a également fonctionné pour eux ...
VBaarathi
7

Ces étapes fonctionnent pour moi.

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

ARWIN
la source
Cela a également fonctionné pour moi. Je l'ai même fait fonctionner sans effacer les données dérivées.
jaytrixz
Cela a fonctionné pour moi, merci beaucoup Arwin, mais je ne comprends toujours pas pourquoi cela soulève une telle erreur parce que je n'ai rien modifié en classe ou en IB auparavant
Kirtikumar A.
7

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 est associée.

Wraithseeker
la source
6

Ce que @gfrs a dit est correct, vous devez configurer le module. Cependant, j'ai rencontré une fois un problème selon lequel ma classe n'était pas répertoriée dans la Classliste déroulante. Finalement, j'ai supprimé le fichier rapide, redémarré Xcode et recréé le fichier. Enfin, la classe a été répertoriée et pourrait être utilisée dans Storyboard.

Jetez également un coup d'œil à cette réponse , qui semble résoudre le «vrai» problème que j'ai rencontré.

Bouke
la source
La suppression et l'ajout de fichiers de classe ont fonctionné pour moi. Merci!
Nicolas Miari
6

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

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

Teng Long
la source
6

Ma solution (Xcode 8.1 Swift 3.0):

Classe inconnue xxx dans le fichier Interface Builder.

Ouvrez StoryBoard en tant que code source et recherchez xxx . Supprimez l'attribut qui contient la valeur xxx . Construisez et exécutez.

ibrahimyilmaz
la source
WTF? C'était absolument nécessaire pour moi, merci. J'ai dû supprimer lecustomModule="" customModuleProvider=""
Dan Rosenstark
1
Si nous essayons de publier une application sur l'App Store contenant une erreur comme celle-ci, l'application est refusée sans réfléchir.
ibrahimyilmaz
Je ne suis pas d'accord. Je viens de soumettre une version que j'ai dû modifier de cette façon à TestFlight et elle est prête pour les tests bêta ... nous verrons ce qui se passe sur la boutique d'applications réelle, mais c'est un bug de l'OMI IMO. Merci!
Dan Rosenstark
4

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

entrez la description de l'image ici

Rostyslav Druzhchenko
la source
3

Dans mon cas, la classe référencée dans le Storyboard / xib n'avait pas d' adhésion cible définie.

Pour résoudre ce problème, donnez à cette classe .het à ces .mfichiers le même abonnement cible que vos autres classes.

Aucune adhésion cible définie.

pkamb
la source
C'était mon problème, mais en essayant diverses solutions, j'ai causé le problème que la réponse d'Epic Byte corrige. Vous devez avoir votre code source dans la cible que vous construisez, mais également dans IB, vous devez définir le contrôleur de vue pour qu'il fasse partie de la cible actuelle.
SafeFastExpressive du
L'adhésion à la cible était aussi mon problème, elle était partout, mais grâce à cette réponse, j'ai pu le résoudre.
Borzh
3

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

DenisKirillov
la source
2
Un exemple avec explication serait formidable.
Nilambar Sharma
2

J'ai rencontré le problème lorsque j'ai porté le storyboard du projet Swift vers le projet Objective-c, en remarquant la réponse de vvkuznetsov , il s'est avéré que 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.

xhg
la source
2

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.

Jignesh Kalantri
la source
2

Mon problème était une erreur utilisateur. J'avais un UIView générique dans mon storyboard et dans la section Custom Class de l'inspecteur d'identité, j'avais accidentellement changé le nom d'UIView en charabia.

Tout ce qu'il a fallu pour réparer était de le changer de nouveau en UIView.

Scooter
la source
J'ai fait la même chose, mais j'avais accidentellement ajouté le nom des contrôleurs de vue personnalisés à la section de classe personnalisée de la vue racine de ViewControllers. Je cherchais donc à voir pourquoi View Controller n'a pas pu être trouvé alors que c'était la vue racine tout le temps.
TMin
1

Ce qui n'a fonctionné 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 censé être la façon dont Apple veut que nous le fassions maintenant.

Cette question montre 3 contournements possibles en version bêta 4 ... apparemment, Apple n'a pas été très utile dans cette situation, selon certains, car ils l'appellent "Travailler comme prévu".

SH
la source
1

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 a été d'ajouter manuellement le nom du module dans le générateur d'interface.

patrickS
la source
1

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 j'ai échoué par erreur à vérifier la nouvelle cible ainsi que la cible d'origine dans la boîte de dialogue de création, donc l'objet n'a été ajouté qu'à mon cible d'origine. La solution consistait à supprimer les fichiers source (supprimer la référence uniquement) puis à les rajouter à l'aide de "Ajouter des fichiers", cette fois en vérifiant les deux cibles.

JulianSymes
la source