web-dev-qa-db-fra.com

Classe inconnue dans le constructeur d'interface

Je sais qu'il y a beaucoup de questions sur ce sujet mais j'ai essayé la plupart d'entre elles pour essayer de le résoudre sans succès.

le problème: au début, je ne pouvais pas ajouter ma classe à partir de l'éditeur adjoint car la classe personnalisée ne l'a pas récupérée. 

  1. Je me suis assuré que les appels héritent de uiviewcontroller
  2. Je me suis assuré que la classe est ajoutée à la cible 
  3. J'ai essayé de supprimer le fichier de classe et de le rajouter
  4. enfin j'ai ajouté la classe à travers le storyboard xml et il est apparu dans la classe personnalisée

Maintenant, j'essaie de connecter mes boutons, vues, etc. à ses prises. Il semble qu'ils soient connectés, mais lors de l'exécution de l'application et de l'ouverture de ce contrôleur de vue, l'application se bloque et le débogueur imprime: "Classe inconnue xxx dans le fichier Interface Builder." Et que "Cette classe n'est pas clé de codage de valeur conforme pour la clé btnMenu. "

J'ai vérifié:

  1. Cet inspecteur de connexion est correctement configuré (aucune erreur dans les prises là-bas)
  2. J'ai essayé de supprimer les données dérivées
  3. Projet propre
  4. Réinstaller l'application

J'ai même essayé de redémarrer mon mac et bien sûr pas de succès.

quelqu'un peut-il éclairer un peu la lumière ici? merci.

20
Max

Je viens de vivre cela avec une sous-classe UIViewController (avec Xcode 9 beta 2 et Swift 4) et la solution consistait à cocher «Hériter de la cible», où je définissais la classe personnalisée dans IB.

Si votre vue se trouve dans un fichier .bundle (par exemple, pour une bibliothèque framework/static) copiée vers une cible différente, vous voudrez définir une cible de module explicite pour chaque classe xib/storyboard plutôt que de l'hériter. la cible qui l'accueille.

63
Anthony Scott

Pour moi, le problème était que la classe ne faisait pas partie des membres cibles. Ajoutez simplement la classe à la cible et vous devriez la voir à nouveau dans le générateur d'interface. Cela m'a aidé dans mon cas. 

 enter image description here

16
Mr. Desai

J'ai eu ce problème avec un UIView personnalisé que je testais, où UIView était dans un framework. J'avais créé une application simple, créé un UIView dans le ViewController par défaut du Storyboard et défini sa classe sur MyCustomView. J'ai toujours eu l'erreur "Classe inconnue dans le constructeur d'interface" lors du lancement de l'application. J'importais mon framework, et j'ai vérifié dans le produit construit que le framework était là.

Le problème était que mon code d'application de test n'a jamais utilisé le framework. Même si le Storyboard en a parlé, je suppose qu'il n'a jamais été chargé. Lorsque j'ai ajouté un [MyCustomView load]; au code de l'application de test, tout a fonctionné.

2
Ben

J'ai rencontré cette erreur parce que j'avais accidentellement enregistré mon fichier de classe dans le dossier Base.lproj lorsque je l'avais créé. 

J'ai corrigé l'erreur en cliquant avec le bouton droit sur le fichier dans le Navigateur de projet et en supprimant la référence. J'ai ensuite déplacé le fichier via le Finder dans le bon dossier. Puis j'ai cliqué avec le bouton droit de la souris sur le groupe principal dans le navigateur de projet, puis sur Add Files to "GroupName"..., sélectionné la classe et cliqué sur le bouton Add.

Après cela, l'erreur est partie.

1
jhonkaman

Ce que @Anthony Scott a mentionné est vrai tant que Framework_A n'est pas dépendant de Framework_B et que la classe provient de Framework_B :) Ensuite, vous devez désélectionner la case à cocher et fournir le module qui contient la classe donnée. Merci pour la question btw. J'utilise Common Framework pour d'autres frameworks et cela m'a aidé à le comprendre;) Pour ceux qui développent des frameworks personnalisés Cocoa Touch, cela peut être utile. 

1
travdu

ok donc je ne sais pas comment et pourquoi, mais j’ai fait (ENCORE) ce que j’avais déjà essayé avant qui est:

  1. supprimer la classe
  2. créer la même classe avec un nouveau nom
  3. enlevé la scène et recréé dans le story-board
  4. connecté tout (de la même manière habituelle !!!)

maintenant, il semble que Xcode connaisse ma classe .... Je ne sais toujours pas quel était le problème, mais je suppose que cela a quelque chose à voir avec l'éditeur de liens.

1
Max

Après avoir coché la case "Hériter le module de la cible" dans la classe personnalisée de la section View Controller, cela fonctionne correctement. Peut suivre l'image.

Pour trouver cela> Sélectionnez votre bouton jaune view controller> puis cliquez sur "Afficher l'inspecteur d'identité"> puis cochez la coche intitulée "Inherit Module From Target".

 enter image description here

0
Shihab Uddin

Si vous essayez d'affecter une classe à un ViewController, assurez-vous que la classe que vous avez créée hérite d'un UIViewController. La seule raison pour laquelle xCode ne reconnaîtra pas votre classe est un type d'instance différent, disons, peut-être un type UITableViewController.

Veuillez vérifier l'héritage de votre classe en premier. 

0
Natasha

Vous devez instancier le contrôleur de vue avec la classe personnalisée. Sans cela, vous pourriez avoir l'erreur.

self.storyboard!.instantiateViewController(withIdentifier: "namePage") as! EmailAndPassword
0
Aaron Zheng

Vérifiez le nom de votre classe. Assurez-vous qu'il correspond à la classe à laquelle vous avez affecté votre ViewController dans l'inspecteur de propriétés.

0
Mo Iisa

rien de tout cela n'a aidé. Mon problème était que j'avais créé des storyboards personnalisés et ajouté des classes personnalisées. Mais j'ai oublié de prendre la flèche du contrôleur de vue initiale du storyboard principal généré automatiquement et j'ai changé le storyboard initial en mon storyboard personnalisé qui l'a corrigé pour moi.

0
sibin