Erreur «Classe <MyClass> inconnue dans le fichier Interface Builder» lors de l'exécution

260

Même si Interface Builder en a connaissance MyClass, j'obtiens une erreur lors du démarrage de l'application.

Cela se produit lorsque MyClassfait partie d'une bibliothèque, et ne se produit pas si je compile la classe directement dans la cible d'application.

jhoule
la source
Comment vous connectez-vous à la bibliothèque?
Elise van Looij
J'utilise un sous-projet dépendant et j'ai fait un glisser-déposer des produits du sous-projet Xcode dans la phase de construction "Link Binary With Library" de ma cible actuelle.
jhoule
Si la classe provient de CocoaPods, cela pourrait aider github.com/CocoaPods/CocoaPods/issues/491 .
Protocole
Pourrait être lié? stackoverflow.com/a/24924967/511299
Sunkas

Réponses:

222

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 MyClasssont 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 -ObjCdrapeaux 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:

+(void)_keepAtLinkTime;

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

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ît.

Comme jlstrecker l'a souligné dans les commentaires, nous n'avons pas vraiment besoin d'ajouter une _keepAtLinkTimeméthode. Il suffit d'appeler un téléphone existant, tel que:

   [MyClass class];

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

jhoule
la source
2
Les données .xib ne sont pas chargées lors de l'exécution. Le compilateur IB compile le xib en un nib; la nib est ce qui est chargé lors de l'exécution.
Peter Hosey
19
Vous n'avez pas à modifier MyClass. Appelez simplement une méthode dont il hérite NSObject, comme +class.
jlstrecker
10
Bien qu'il ne s'agissait pas de Xcode 4 lorsque la question d'origine a été publiée, ce qui suit semble toujours approprié. Dans Xcode 4 au lieu d'ajouter une méthode factice pour éliminer l'erreur, vous pouvez vérifier toutes les cibles nécessaires MyClass.mdans la section Appartenance à la cible de l'inspecteur de fichiers.
2011
51
Une autre possibilité de nos jours est que MyClass.m pourrait ne pas être dans votre phase de compilation des sources de compilation. Cela peut se produire si vous faites glisser MyClass.h / m dans votre projet, plutôt que de les créer à l'aide d'un nouveau fichier.
Steven Fisher
6
@JoshBruce pouvez-vous expliquer la solution Swift? Je ne le comprends pas vraiment.
Ryan Bobrowski
183

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.

Tapoter
la source
Il est vrai que parfois, l'erreur de l'éditeur de liens est simplement due à la non-compilation de votre fichier dans votre cible. Ce que vous décrivez est la façon de contrôler les cibles auxquelles un fichier est associé. Malheureusement, mon fichier faisait déjà partie de ma cible, mais j'avais toujours un problème de lien. Cela était probablement dû au fait que ma bibliothèque était C ++ (par opposition à Objective-C), qui a différents indicateurs de l'éditeur de liens par défaut (voir les articles d'Alasdair Allan et Sijo ci-dessus).
jhoule
5
Cette suggestion a fonctionné pour moi, bien que légèrement différemment, car ma case à cocher "Adhésion cible" était déjà cochée. Je l'ai décoché et reconstruit, mais le message d'erreur a changé pour indiquer mon nouveau nom de classe. En cochant à nouveau la case et en reconstruisant, tout fonctionne maintenant. Bien plus simple que de supprimer des fichiers cache!
electromaggot
Excellente solution via Xcode UI. @electromaggot, Xcode peut devenir confus lorsque vous ajoutez des classes manuellement, vous devrez donc peut-être ajouter plusieurs fichiers.
Gonen
C'est aussi une solution pour moi. J'avais glissé dans certains fichiers de classe d'un autre projet, et ces fichiers de classe étaient ceux qui ont soulevé l'exception.
hairbo
1
J'ai supprimé un fichier de mon projet, puis j'ai ajouté le même fichier plus tard, ce qui a résolu le problème.
MindSpiker
70

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 -ObjCindicateurs à la Other Linker Flagsclé 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_loadindicateur de l' éditeur de liens. Si vous sautez ces indicateurs tôt ou tard, vous rencontrerez l'erreur unrecognized selectorou obtiendrez d'autres exceptions telles que celle que vous avez observée ici.

Alasdair Allan
la source
5
J'ai trouvé que seul le -ObjCdrapeau le fixait dans mon cas.
Kekoa
5
@Kekoa, c'est parce que votre version de Xcode (LLVM) est plus récente que le type qui a écrit cette réponse avait utilisé. De nos jours, l'utilisation -ObjCest suffisante pour résoudre le problème.
jusqu'au
cela m'a seulement aidé. Pendant la compilation, il a montré les problèmes liés au framework qui ont également été résolus une fois que j'ai importé tous les frameworks.
Vaibhav Saran
-Le drapeau d'ObjC seul a résolu mon problème. J'ai en fait une erreur pour avoir l'attribut all_load dans iOS7.
Sushma Satish
L'utilisation de -all_load -ObjC peut entraîner une augmentation inutile de la taille du produit. ce problème se produit également avec les fichiers de catégorie dans les frameworks uniquement.
Ali Amin
26

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

J'ai changé une classe Model.h + Model.men a Model.swift. Cet objet a été 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 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"

Besi
la source
1
Cela semble être la bonne réponse. Sauf si quelqu'un peut dire le contraire, cela doit être marqué comme correct.
Bjørn Ruthberg
1
Grande réponse merci. Pour moi, le Modulenom était juste là dans le menu déroulant. C'était le nom de mon application.
ChrisH
Ça marche pour moi. Pour mon problème, le <TARGETNAME> mentionné dans votre réponse, est le nom du framework qui contient la classe.
Tyler Long
Je suis arrivé à la conclusion par moi-même, c'était aussi l'erreur que je recevais et j'étais prêt à publier mes résultats lorsque j'ai vu votre message. En fait, je l'ai vu mais je l'ai dépassé à cause des nombreuses réponses et du bruit qui l'entourait. Je pense que votre réponse pourrait être améliorée par quelques captures d'écran pour différencier votre réponse des autres. Je l'attraperais certainement s'il en était ainsi. Merci beaucoup, de toute façon, de l'avoir affiché ici. Vous avez obtenu mon vote positif.
jvarela
Pour l'AppDelegate, j'ai pu résoudre ce problème dans l'interface utilisateur d'Interface Builder. Pour la classe personnalisée d'un élément d'interface utilisateur dans une fenêtre, l'interface utilisateur d'Interface Builder ne me permettait pas de définir la classe et le module personnalisés. J'ai dû faire ce qui suit: (1) Ouvrez le fichier .xib en tant que "code source" (clic droit dessus). (2) Ajoutez l'attribut "customModule = <TARGETNAME>" à côté de l'attribut customClass.
Poulsbo
20

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

Subbu
la source
oui, je n'avais pas coché TOUTES les cases cibles que je voulais ajouter à mes classes nouvellement importées. Merci!
Joel Balmer
Oui! Mon fichier VC manquait dans le projet Target.
Sebastian Dwornik
19

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

Ignacio Pascual
la source
8
Dans les paramètres de création de projet, vous devez ajouter les indicateurs "-all_load -ObjC" à la clé "Autres indicateurs de l'éditeur de liens". Ce n'est pas un problème spécifique à Xcode 4, et en fait n'a généralement rien à voir avec Interface Builder non plus.
Alasdair Allan
Cette solution a déjà été suggérée en janvier 2010 (voir ci-dessus).
jhoule
6
Oui - la façon la plus simple de le faire est simplement d'ouvrir le simulateur iOS et, dans le menu, de choisir «Réinitialiser le contenu et les paramètres»
RanLearns
Ou vous pouvez faire ce que j'ai fait et simplement supprimer l'application en question de l'écran d'accueil du simulateur. J'ai eu le même message d'erreur, mais il faisait référence à un ancien délégué d'application.
spstanley
16

Parfois, IBuilder 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
L'utilisation de Xcode 6.3 (6D570) dès que j'exécute le paramètre revient à l'original (mauvais). Punaise? J'essaie d'inclure un fichier rapide dans un projet Objective C.
addzo
Sur XCode 6.4, l'ajout de customModuleProvider = "target" dans le code source du storyboard, sous le viewcontroller souhaité, a résolu le problème.
Amro Shafie
J'ai pu résoudre mon problème avec juste customModule="MyFrameworkName". Énorme +10
Stan
En fait, mon problème était le contraire, je voulais supprimer le CustomTaget mais Xcode ne changeait pas le fichier source xib, j'ai donc dû supprimer customModule = "AppName" customModuleProvider = "target" pour le faire fonctionner.
Adriana
14

Mon 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

entrez la description de l'image ici

Dhilip
la source
2
J'utilise un framework Swift dans le projet Swift installé par CocoaPods. Cette méthode fonctionne. Et le nom du module est le nom du framework.
JsW
1
Cela fonctionne parfaitement. Besoin de savoir pourquoi ce module est supprimé ??
iSrinivasan27
Fonctionne parfaitement avec les problèmes de frameworks cocoapod ... bravo à vous pour une réponse parfaite ...
jayant rawat
13

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

Jackie Lee
la source
Oui, après avoir ajouté de nouveaux fichiers d'un projet précédent dans un projet XCode 4.5, l'ajout des fichiers .m à la liste des sources de compilation l'a fait à coup sûr. L'ajout de "-all_load -ObjC" n'a pas fonctionné dans mon cas, mais n'a pas fait de mal.
whyoz
13

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

customClass="UnrecognizedClassName"

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

travaillé pour moi.

entrez la description de l'image ici

smileBot
la source
J'utilise l'application OSX TextEdit. Cela a bien fonctionné pour cette opération. Assurez-vous de fermer votre projet en premier et de fermer Xcode.
TJ
Cela aussi a aidé. J'avais plus d'un objet avec la même classe personnalisée, j'ai probablement cliqué sur la vue au lieu du contrôleur et attribué le même nom.
Mc-
1
C'était aussi la solution au problème que j'ai rencontré; J'avais précédemment entré un nom de classe partiel et le storyboard a été enregistré de cette façon (par exemple 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 :)
dave
9

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?

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

tu devrais être bon pour aller après

abbood
la source
2
Je ne peux plus attribuer +1 à celui-ci, j'ai résolu mon problème Mon problème était exactement le même lorsque le fichier avait déjà été supprimé, mais l'avertissement apparaissait toujours lors de la compilation.
Brett
Dans le Storyboard, vous devez remplir l'identifiant. Parfois, je l'écris par erreur dans le champ "Classe" (dans l'inspecteur d'identité). Le compilateur se plaint donc d'une raison pour laquelle la classe n'existe pas!
Vincent
9

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

Amit B
la source
Cela marche. Je développais un pod et pour une raison quelconque, la commande pod install appliquait la mauvaise cible à un fichier de classe particulier. Il était appliqué à un ensemble de ressources que j'avais. La configuration correcte est Pods- <project-title> - <pod-title>
krosullivan
Ça ne marche pas pour moi. L'appartenance cible est correcte, mais l'erreur continue de se produire.
Kokodoko
8

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.

Laura
la source
1
lorsque j'ai créé les fichiers pour la première fois, je n'avais pas de .m à la fin. J'ai essayé de renommer le fichier et de l'ajouter à nouveau, mais j'ai quand même dû supprimer et recréer le fichier avant que xcode ne soit satisfait.
2011
Votre fichier ne faisait probablement pas partie de votre cible. Le rajouter a probablement abouti à une case à cocher par défaut dans la bonne cible.
jhoule
1
Cette solution a également fonctionné pour moi, mais je me suis assuré à 100% qu'avant de supprimer la première classe (.h + .m), j'ai vérifié qu'elle faisait partie de ma cible. Ce n'était pas le problème pour moi. Comme Laura, je viens de supprimer la classe et de la refaire (avec un nom différent), et cela a bien fonctionné, sans aucune des autres solutions de cette page.
Nate
7

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

@implementation MyTableViewCell

@end

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

Zack Morris
la source
6

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:

  • Faites un clic droit sur le .xib et sélectionnez Ouvrir en tant que> Code source
  • Dans ce fichier, recherchez l'ancien délégué d'application et remplacez-le par le nouveau
SB
la source
Ouvrir en tant que code source n'existe plus, mais vous pouvez tout aussi facilement cliquer avec le bouton droit, Afficher dans le Finder, puis cliquer avec le bouton droit sur le fichier et ouvrir dans TextEdit. Bien sûr, sauvegardez le fichier avant d'apporter des modifications;)
Scott Allen
6

ajoutez simplement le code ci-dessous au début de la méthode appdelegate applicatoindidfinishlanching, cela fonctionnera bien

[classe myclass];

iSpark
la source
5

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

Après avoir cherché et 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 générateur d'interface en X-code, en faisant un clic droit dessus et en choisissant 'voir comme code source'. Puis la recherche est venue

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

user776904
la source
5

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 leCopier les ressources du bundle

Sean Dong
la source
Grâce à vous, j'ai commencé à regarder la liste et j'ai découvert que mon fichier manquait, probablement quand je l'ai créé, je n'ai pas fixé les objectifs correctement
schmru
4

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 :

  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 tout ce qui dit

customClass = "UnrecognizedClassName"

  1. Ouvrez à nouveau votre fichier de storyboard en tant que "interfacebuilder - storyboard" et reconstruisez votre application.
jaymgee
la source
3

Il suffit de supprimer les MyClass.m et .h et de les ajouter à nouveau au projet est un travail pour moi.

yebw
la source
3

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.

Paul Finger
la source
2

J'ai rencontré ça dans Swift.

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

jaime
la source
Merci d'avoir partagé cela, mais cela n'a pas résolu mon problème. Voici la solution que j'ai finalement trouvée: stackoverflow.com/a/28760089/456434
Mazyod
2
J'ai aussi rencontré ce problème. Mais dans mon cas, le nom du module manquant était le problème: voir < stackoverflow.com/a/29013058/784318 >
Besi
1

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!

aarthur
la source
1

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)

Don
la source
1

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.

fer à cheval7
la source
1

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.

Robert White
la source
1

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!

Tim
la source
1

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

Jdizzle Foshizzle
la source