"Impossible de trouver des informations pour la classe nommée ViewController"

154

Ce bug me rend fou depuis que j'ai commencé à utiliser Xcode (4.6.3). Chaque fois que j'essaye de lier un élément de Storyboard à mon code, j'obtiens l'erreur:

Impossible de trouver des informations pour la classe nommée ViewController.

Cela se produit également avec les classes personnalisées. J'ai essayé des méthodes telles que:

  • Suppression des données du délégué.
  • Suppression et réajout des classes.
  • Redémarrage de Xcode.
  • Réinstaller Xcode.

Je ne peux pas faire glisser la touche Ctrl pour créer des connexions dans aucun de mes projets, quelle que soit la classe. Le même problème se produit avec une toute nouvelle application de modèle. Si je tape le code manuellement, puis ctrl-drag, je peux établir une connexion fonctionnelle, mais je ne peux pas l'ajouter automatiquement. Rien de ce que j'ai pu trouver jusqu'à présent sur Internet n'a aidé. Des pointeurs?

user2597451
la source
Êtes-vous triple sûr que le fichier .m ViewController est inclus dans la cible appropriée? (case à cocher dans le panneau de l'inspecteur de droite)
Alfie Hanssen
2
Vous avez un contrôleur de vue dans votre storyboard et avez spécifié "ViewController" pour le nom de la classe qui doit être instanciée pour gérer la vue. Vérifiez chaque contrôleur de vue dans le storyboard: sélectionnez le contrôleur de vue, regardez «l'inspecteur d'identité» dans le volet de droite et regardez la propriété «Classe personnalisée». S'il lit "ViewController", il y a votre problème. Mettez le nom de la classe qui devrait gérer votre contrôleur de vue ... ou mettez UIViewController pour obtenir l'implémentation UIKit par défaut.
Nicholas Hart
1
J'ai changé la classe personnalisée en "UIViewController" dans l'inspecteur d'identité, et je ne pouvais plus faire glisser le curseur du storyboard vers ViewController.h. Si je crée une nouvelle classe et que j'essaye de faire glisser le curseur dessus (après avoir défini la classe du contrôleur de vue en conséquence), j'obtiens la même erreur «Impossible de trouver des informations».
user2597451
4
J'ai eu ce problème et la modification de la classe ViewController générée automatiquement a fonctionné pour moi. Par exemple, ajoutez simplement un NSLog()toviewDidLoad:
jb

Réponses:

292

Ce qui a résolu ce problème pour moi était en fait la suppression de la classe du projet.

Pas:

  1. Dans l'explorateur de fichiers de projet (panneau de gauche), recherchez la classe et faites un clic droit -> Supprimer
  2. Supprimer la référence (ne pas déplacer vers la corbeille car vous perdrez la classe pour de bon)
  3. Faites un clic droit sur le dossier contenant la classe -> Ajouter des fichiers à ...
  4. Trouvez la classe que vous venez de supprimer dans le système de fichiers

Cela semble forcer Xcode à relier la classe au storyboard.

Remarque: pour moi, ce qui suit n'a pas fonctionné:

  • Fermer Xcode
  • Nettoyage du projet
  • Supprimer le nom de la classe du storyboard et le ressaisir

Je pense que c'est un bug d'Apple

Chris Harrison
la source
8
J'ai essayé cela, mais cela n'a pas fonctionné pour moi / -: même erreur.
Michael
1
@Michael, Oui, maintenant je suis dans une situation où rien de ce qui précède ne fonctionne du tout. Xcode is a ***
Chris Harrison
5
Ce problème remonte à juillet 2013, à partir d'aujourd'hui mai 2016, je reçois le même bogue et je l'ai corrigé avec cette réponse. Comment se fait-il que dans tant d'années, Apple ne répare pas le problème pour de bon?
SkyWalker
3
Je ne peux pas croire que ce soit toujours un problème. Juste eu à faire cela sur XCode 8.1 ..
fisk
2
2017 (Version 8.2 (8C38)) et toujours en vie, Xcode SUCKS. Cela m'arrive lorsque vous copiez-collez le personnel de l'interface utilisateur du storyboard d'une scène à une autre
Jaime Agudo
135

Au cas où quelqu'un serait encore frustré par cela, il y a une astuce pour faire fonctionner les choses.

Ce que je fais, c'est entrer manuellement un point de vente dans ma classe, par exemple @IBOutlet weak var someView: UIView!:, et faire glisser du code vers la vue dans IB ou storyboard. Après cela, je suis capable de faire glisser de IB / Storyboard vers ma classe pour établir des connexions, les éditeurs assistants reconnaissent la classe en "Automatique", etc ...

Fonctionne à chaque fois.

Andrew Robinson
la source
6
@ Gmeister4, si vous créez une prise dans votre code, il affiche un petit cercle à gauche de la prise. Cliquez et faites glisser de ce cercle vers la vue dans IB ou Storyboard pour établir votre connexion.
Andrew Robinson
4
Plus facile que la première réponse. +1
cph2117
2
Je ne peux toujours pas le faire correctement, même pas après cela - mais au moins cela fonctionne!
Alexandre G
1
Aucune des réponses ci-dessus n'a fonctionné pour moi. Seule cette réponse a fonctionné pour moi.
coolcool1994
1
Génial, c'est tout!
Sam
38

Pour moi, les supprimer de votre adhésion cible dans la colonne de droite et les ajouter à nouveau a fait l'affaire entrez la description de l'image ici

Ruud Visser
la source
Cela a également fonctionné de moi. J'avais dupliqué la classe ViewController.swift, et cela semble être la solution.
UberJames
Je pense que c'est un bogue de Xcode qui existe toujours dans Xcode 8.0
jiangjiefs
Cela m'est arrivé en ce moment dans Xcode 8.3.3 et votre solution est la plus simple et fonctionne. Alors merci!!!
RoberRM
Existe toujours dans Xcode 11.5 (je veux dire sérieusement Apple ??). Seule solution qui a fonctionné pour moi répertoriée ici.
Christophe Fondacci le
12

Parfois, Xcode le fait parce que VC ne fait pas référence au fichier de classe. La solution simple pour cela est:

écrire la propriété manuellement comme indiqué.

class YourClassName{

     @IBOutlet weak var YourTableName: UITableView!

}

Cela créera un signe de lien vide avant @IBOutlet , ouvrira votre projet dans l'éditeur assistant, puis cliquez sur le signe de lien entrez la description de l'image iciet faites glisser dans la vue que vous souhaitez connecter (je me suis connecté avec TableView). et c'est tout. Profitez de Happy Coding !!!

MRizwan33
la source
8

Je viens d'avoir ce problème en avril 2017 avec Xcode 8

Le simple fait de créer une prise via le code et de compiler le corrigeait. par exemple:

@IBOutlet weak var containerViewHeight: NSLayoutConstraint!

Vous devez aimer Xcode…

Edit: se passe toujours sur Xcode 9

Jésus Rodriguez
la source
7

les étapes suivantes fonctionnent pour moi j'espère que cela fonctionne aussi pour vous

1- Vous devez rouvrir votre projet après avoir fermé Xcode.

2- Attendre l'indexation des fichiers du projet

3- Vérifiez si cela fonctionne ou non

4- Si cela ne fonctionne toujours pas, suivez l'étape 5, si ce n'est pas satisfait pour vous :)

5- Nettoyer et construire la cible de votre projet

entrez la description de l'image ici

Amr en colère
la source
7

J'ai tout essayé et cela n'a pas fonctionné, donc pour moi, ce qui a fonctionné est:

  • Nettoyer le dossier et le projet Build.
  • Projets ouverts (Fenêtre -> Projets)
  • Recherchez votre projet dans la liste et supprimez les données dérivées
  • Fermer Xcode
  • Redémarrez l'ordinateur (sans choisir de rouvrir les fenêtres ouvertes)
  • exécuter Xcode
  • Travail!

Tous mes contrôleurs de vue n'étaient pas reconnus, donc supprimer tous les fichiers et les rajouter n'était pas une option car il s'agit d'un gros projet.

jeux vidéo
la source
4

Pour moi, ce qui suit a fonctionné:

  1. Effectuez un 'nettoyage' et un 'dossier de construction propre' (appuyez sur 'option' dans le menu Produit pour obtenir la commande 'nettoyer le dossier de construction'

  2. Arrêter Xcode

  3. Dans le terminal, accédez au dossier des données dérivées:

    (/ Utilisateurs // Bibliothèque / Développeur / Xcode / DerivedData)

Supprimez le répertoire de données dérivé de votre projet.

  1. Agiter le poulet mort dans les airs

  2. Démarrer Xcode

Joe149
la source
3

J'ai dû faire une combinaison de quelques réponses jusqu'à présent:

  1. Supprimez le nom de classe personnalisé du storyboard.

(Cliquez sur le bouton jaune en haut à gauche du contrôleur de vue dans le storyboard -> allez dans l'inspecteur d'identité (option + commande + 3) -> supprimez le nom de la classe personnalisée en haut)

  1. Supprimez la référence au fichier du contrôleur de vue.

(Cliquez avec le bouton droit sur le fichier -> supprimer -> supprimer la référence)

  1. Ajoutez le fichier du contrôleur de vue au projet.

(Faites un clic droit sur le dossier où se trouvait le fichier -> "Ajouter un fichier à [projet]")

  1. Ajoutez le nom de la classe personnalisée au storyboard.
yndolok
la source
3

Si les gens essaient ce qui précède et que les choses ne fonctionnent toujours pas, l'étrange astuce qui a fonctionné pour moi a été d'ajouter le point de vente dans un espace blanc. Cela fonctionne s'il n'y a pas d'autres lignes directement au-dessus ou en dessous de la ligne que vous ajoutez. Étrange, mais ça a marché!

Elliot KG
la source
3

Ce qui a fonctionné pour moi, c'est qu'au lieu de faire glisser la connexion du bouton vers le code, c'était:

  1. En cliquant sur l'élément de storyboard souhaité.
  2. Ouverture de l'inspecteur de connexion (panneau de droite)
  3. Faire glisser du cercle + vers la zone de code. Ainsi:

après avoir lié mon code de cette manière, il a fonctionné normalement par la suite.

Hayden Crabb
la source
3

Reste sur la cible!

J'ajoutais une nouvelle classe avec un Xib et j'ai commencé à voir ce problème et j'ai passé un bon moment à regarder les réponses ici et à voir si cela faisait une différence.

En l'occurrence, j'ai plusieurs cibles dans mon espace de travail et je dois souvent basculer entre elles.

Il s'avère que l'ajout de nouveaux fichiers lancera une réindexation dans Xcode. Mais si vous pointez sur la mauvaise cible, l'indexation n'aura probablement aucun sens et pendant le glissement pour connecter Xcode ne pourra pas trouver votre classe.

En bref

Étape 1.

Sélection de la cible

Assurez-vous que vous avez défini la cible correcte pour que l'indexation ait du sens.

Damo
la source
3

Cela a fonctionné pour moi:

  1. Effectuer ' Clean build folder '
    (appuyez et maintenez la touche 'option' et allez dans le menu " Product " pour y accéder.
  2. Effectuez un simple "Clean" (CMD-SHIFT-K) depuis le menu " Product ".
  3. Générez le projet pour laisser Xcode compiler les fichiers. Aussi, laissez-le indexer les fichiers si nécessaire.

Sur une note latérale, je ne suis pas sûr si cela a aidé, mais j'ai également supprimé les données dérivées avant d'effectuer les étapes ci-dessus (préférences Xcode> Emplacements)

programmeur
la source
2

Sélectionnez le ViewController dans storyBoard, supprimez la valeur actuelle dans le panneau de droite / "Classe client" / "classe" puis rajoutez la classe de contrôle (type: "SampleViewController" ...), entrez. -> Cela fonctionne pour moi

tungnv
la source
2

J'ai essayé toutes ces réponses, le problème pour moi était lié au fait que Xcode ne pouvait pas indexer les fichiers. J'ai résolu cela en quittant simplement Xcode et en rouvrant le projet. Bien sûr, je l'ai fait après avoir essayé toutes les solutions ci-dessus: p

JohnVanDijk
la source
2

Produit> Clean (Command - Shift - K) l'a corrigé pour moi!

Jangles
la source
2

C'est l'étape la PLUS FACILE que j'ai faite pour résoudre ce problème.

  1. Je nettoie le projet
  2. Faites glisser un nouveau bouton dans le contrôleur de vue.
  3. Construisez le projet.
  4. Connectez le bouton nouvellement déplacé à la classe (sortie ou action).
  5. Alors voila !!! D'autres points de vente peuvent maintenant être à nouveau connectés à la classe!
user2480567
la source
1

D'après mon expérience de test, si vous supprimez une classe qui était associée dans le Xcode et que vous ajoutez à nouveau un fichier, ce problème se produira.

inix
la source
1

Habituellement, lorsque cela m'arrive, je n'ai tout simplement pas encore enregistré le code de la classe. Passez simplement au code et appuyez sur cmd + s et cela résout souvent le problème de la bonne manière.

Délimiteur
la source
1

Il suffit de nettoyer et de reconstruire le projet.

Carolina Aguilar
la source
1

Aucune des étapes ci-dessus n'a fonctionné pour moi, mais je pense que j'ai peut-être découvert le problème. Au moins, c'est ce qui a fonctionné pour moi, et ce n'est pas un bogue dans Xcode.

Dans l'éditeur assistant, regardez en haut de la fenêtre contenant le code de votre viewController. La troisième option à droite indique probablement «Manuel», mais elle devrait indiquer «Automatique». Une fois que j'ai changé cela, le problème a été résolu!

John Nolan
la source
1

J'avais un problème similaire, "Impossible de trouver une classe nommée ..." et la cause était stupide de ma part une fois que je l'ai compris. Assurez-vous que vous ne faites pas glisser de l'élément vers l' interface - assurez-vous qu'il est déplacé vers la classe elle-même

Will Buffington
la source
1

J'ai tout essayé!

Assurez-vous que le nom de classe de votre UIViewController ne contient pas le mot "Test"

Rapport de bogue soumis.

Aaron Kreipe
la source
Certainement pas dire que c'est la seule cause. Juste que c'est une autre chose dont il faut être conscient.
Aaron Kreipe
Aidez-moi à supprimer toutes les données dérivées, nettoyer le projet. Mais c'est un bug et vous avez raison.
Genevios
0

J'essaierais de refaire les fichiers .m et .h en question et de leur donner un nom original, pas générique comme "ViewController". Essayez quelque chose de plus dans le sens de ce que vous voulez que ce fichier fasse, et se terminant par View Controller (par exemple "PizzaDecoraterViewController")

Sélectionnez ensuite le ViewController que vous souhaitez connecter à ces fichiers. Assurez-vous que vous sélectionnez le ViewController, pas seulement un objet à l'intérieur. Cliquez sur la barre noire en bas (celle qui a les icônes «Premier répondant» et «Quitter»). L'ensemble ViewController doit être encadré en bleu. Ensuite, allez à la section Classe personnalisée dans l'inspecteur d'identité et vous devriez voir un "UIViewController" grisé dans le premier champ. Dans ce champ, tapez le nom du fichier .h ou .m auquel vous voulez qu'il se connecte (commencez à taper PizzaDecorator ... et il devrait faire une petite chose d'auto-complétion). Puis appuyez sur ENTER.

Lorsque vous ouvrez l'Assistant Editor, assurez-vous que le fichier sur lequel vous essayez de glisser-déposer est, en fait, le fichier correct.

Si vous avez tout fait comme indiqué ci-dessus, cela devrait fonctionner.

CaptJak
la source
Cela ne fonctionne toujours pas, malheureusement. J'ai essayé de le faire avant en vain. Voici une capture d'écran: i.imgur.com/5ixtcps.png
user2597451
Huh. Étrange. Essayez de les ajouter par programmation (c'est-à-dire @property (non atomique, fort) IBOutlet UIView * test;), puis lorsque le petit cercle apparaît à côté, faites un glisser-déposer vers votre UIView.
CaptJak
Cela fonctionne et a toujours fonctionné (et les applications semblent fonctionner correctement), mais j'essaie de résoudre le problème qu'il n'ajoutera pas automatiquement.
user2597451
Eh bien, si cela fonctionne comme ça, alors cela devrait fonctionner dans l'autre sens. Bug dans votre XCode? Essayez d'obtenir une version précédente (comme 4.6.2 ou quelque chose du genre) et installez-la. Sinon, ummmmmmmmmmmmmmm ...... ouais ....
CaptJak
Ouais, c'est ce dont j'ai peur. La désinstallation et la réinstallation ne fonctionnaient pas, j'espérais que je faisais une erreur. Quelle est la meilleure façon de rétrograder ma copie de Xcode?
user2597451
0

Comme je l'ai commenté sur la réponse de @ ChrisHarrison, ces choses n'ont pas fonctionné pour moi, mais en supprimant les données dérivées comme je l'ai fait fonctionner en supprimant les données dérivées comme dans https://stackoverflow.com/a/16182672/1449799

Michael
la source
0

Supprimez les fichiers (uniquement les références) et ajoutez à nouveau les fichiers.

jomafer
la source
0

Eh bien dans mon cas, la chose qui a fonctionné (c'est un peu bizarre, mais a fonctionné) est la suivante:

Essayez d'ajouter une source de données (par exemple, une extension au ViewController comme un UITableViewDataSource). Xcode essaiera de recharger le ViewController. Ensuite, j'ai écrit une méthode du protocole (au début, Xcode ne remplissait pas automatiquement les méthodes, mais l'écrivait manuellement), puis j'ai ajouté les IBOutlets, et enfin, j'ai supprimé la source de données.

Exemple:

class TestViewController:UIViewController{
    // This viewController presents “Could not find any information for  class named ViewController”
}

extension TestViewController:UITableViewDataSource{
    //Add Some methods of the protocol, Xcode will try to autocomplete and then it's going to reload the class, from then you can add your IBOulets / Actions .. And remove this extension if you don't need it otherwise.
}
José Roberto Abreu
la source
0

Pour moi, la vue pour laquelle j'avais spécifié une classe personnalisée ne parvenait pas à être compilée par le constructeur d'interface. C'était marqué @IBDesignable.

La suppression @IBDesignable, puis l'ajout de mes prises, puis le marquage comme @IBDesignablerésolvant le problème dans mon cas.

Nick DiZazzo
la source
0

Essayez simplement de supprimer les données dérivées du projet

david.gol
la source
0

essayez juste ça

rm -rf ~/Library/Caches/com.apple.dt.Xcode
defaults delete com.apple.dt.Xcode IDEIndexDisable
defaults write com.apple.dt.Xcode IDEIndexEnable 1 
yousuke
la source