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.



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


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

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

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


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


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


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.


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


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


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


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


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.


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.


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



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.


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


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.


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


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.


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.


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


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.


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


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.


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.


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.


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


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.