Xcode 4: Création d'un UIView xib, connexion incorrecte


84

J'essaie de créer une pointe qui contient une vue qui sera intégrée dans une TableViewCell. J'ai créé l'interface et les fichiers d'implémentation, ResultCell.het ResultCell.m. Ils sont en stock, prêts à l'emploi, aucun changement de code.

Je crée ensuite un fichier XIB vide et fais glisser un UIView dessus. Ensuite, je clique sur le propriétaire du fichier et définit le type sur ResultCell. Je clique sur la vue et définit sa classe comme étant également ResultCell.

Voici les problèmes que j'ai:

  1. Lorsque vous utilisez la vue Assistant Editor (dans laquelle je vis), le ResultCell.hfichier n'apparaît pas lorsque je visualise le fichier ResultCell.xib. Je dois le forcer à se charger en cliquant sur Automatique et en sélectionnant le fichier.
  2. Lorsque je dépose une étiquette dans la vue, puis Ctrl + Cliquez et faites glisser vers le .h pour créer une prise, j'obtiens ce message d'erreur: « Impossible d'insérer une nouvelle connexion de prise: impossible de trouver des informations sur la classe nommée ResultCell. "

J'ai essayé de créer et de recréer la vue, mais cela ne fonctionne tout simplement pas, et j'ai commencé à perdre patience. Toute aide serait très, très appréciée!


Je viens de rencontrer cela moi-même. Hier soir, cela a fonctionné et aujourd'hui rien. Je vous ferai savoir si je trouve quelque chose.
Tavison

Pour mémoire, plusieurs réponses ici m'ont aidé au cours de la dernière année. Les versions récentes de Xcode ont amélioré les choses.
Tim Sullivan

Réponses:


82

Cela peut ne pas fonctionner pour votre problème spécifique, mais j'obtiens parfois cette erreur lorsque je travaille avec des plumes nouvellement créées. La suppression et la recréation des pointes et des contrôleurs de vue portant les mêmes noms qu'auparavant n'ont pas résolu le problème, mais la relance de Xcode l'a fait.


+1 a travaillé pour moi aussi. Redémarrez simplement XCode, et maintenant je peux CTRL + Glisser pour créer de nouveaux @propertys dans mon fichier .h.
Mike Gledhill

1
La réponse de David Pisoni a fonctionné pour moi. Le simple fait de redémarrer Xcode n'a pas coupé la moutarde.
Andy

Je n'ai pas eu ce problème pour de nombreuses versions de Xcode maintenant, il y a donc probablement une autre cause qui est plus répandue maintenant que celle que j'ai rencontrée lorsque j'ai écrit cette réponse l'année dernière.
Défragmenté

@Defragged pouvez-vous également inclure l'étape pour vider le cache en appuyant sur la commande K avant de citer ou encore mieux est de quitter Xcode puis de vider le cache ( ~/Library/Developer/Xcode/DerivedData)
user1046037

Je travaille avec Xamarin Studio. J'ai dû quitter xcode et xamarin studio, puis rouvrir Xamamrin Studio et ouvrir un fichier xib à partir d'ici qui s'est lancé dans xcode. L'éditeur assistant s'est alors ouvert correctement.
Dave Haigh

113

Je suis entré dans un état similaire aujourd'hui. C'était très étrange: je pouvais attacher n'importe quel XIB (nouveau ou existant) à n'importe quelle classe ViewController déjà existante dans le projet, mais je ne pouvais pas créer un nouveau ViewController et le faire attacher correctement à n'importe quel XIB. La fonctionnalité "assistant" ne fonctionnait pas, pas plus que la fonctionnalité de connexion IB-to-headerfile.

La fermeture du projet et la réouverture n'ont pas résolu le problème.
Le fait de quitter XCode et de redémarrer n'a pas résolu le problème.
Créer un nouveau projet et tester la fonctionnalité fonctionnait bien, ce qui m'a conduit à croire qu'il y avait quelque chose de corrompu dans un cache quelque part.

Ma solution

  • Fermez votre projet.
  • Accédez au dossier ~ / Library / Developer / XCode / DerivedData et SUPPRIMEZ tous les sous-dossiers référençant le projet sur lequel vous travaillez.
  • Ouvrez votre projet dans XCode. Le problème devrait être résolu maintenant.

Incidemment, le simple fait de faire un nettoyage complet ne semblait pas clarifier les choses. J'ai dû détruire les données dérivées. Je suis certain que je suis arrivé dans cette position à cause des jeux git auxquels je jouais, mais je ne savais pas comment m'en sortir, car même le retour aux révisions git antérieures n'aidait pas. (C'était aussi un gros indice que c'était quelque chose qui n'avait pas été suivi par le projet lui-même.)


6
Je viens de me connecter à SO sur mon Mac, juste pour pouvoir voter pour cette réponse! Totalement travaillé pour moi. Cela me rendait fou, car j'apprends juste à utiliser XCode et c'est déjà assez difficile sans problèmes ridicules comme ceux-ci. :) Merci!!!
Dave

2
cela fonctionne même sans redémarrer xcode; il suffit de supprimer les données dérivées et de les reconstruire (sur un projet iOS)
no

Cela n'a pas fonctionné lors du redémarrage de xcode. Je n'ai aucune idée de la façon dont cela s'est passé par la méthode de David Pisoni qui a très bien fonctionné.
mmopy

Impressionnant. Comment saviez-vous que? A travaillé pour moi.
hol

1
lol c'est bon de savoir que IOS et xcode peuvent être tout aussi bogués sinon plus que d'utiliser eclipse et Android: p
James andresakis

14

Je viens d'avoir ce problème et le redémarrage de Xcode ne l'a pas résolu. J'ai supprimé les fichiers de classe du projet, puis les ai rajoutés et cela a commencé à fonctionner.


13

J'ai eu le même problème. Et j'ai essayé:

  • Redémarrer Xcode
  • Suppression des données dérivées
  • Et beaucoup plus

Rien de tout cela n'a fonctionné. Ce qui a fonctionné pour moi était simplement de:

  • Supprimez les fichiers de classe `` suspects '' du projet (supprimez simplement les références, hein?)
  • Ajoutez-les de nouveau au projet

Et.. Voila!


2
Cela a fonctionné pour moi, merci! C'était la première chose que j'ai essayée, à part le redémarrage de XCode, car cela semblait être le moins de travail et de risque, et cela fonctionnait très bien.
adriandz

1
a fonctionné pour moi après le redémarrage de xcode et la suppression des données dérivées
n'a

1
Celui-ci a fait l'affaire pour moi aussi. Cela peut avoir quelque chose à voir avec la refactorisation des noms de classe (ce que je viens de faire auparavant).
écotaxe

9

Si le redémarrage de Xcode ne fonctionne pas de votre part, j'ai constaté que basculer le nouveau fichier .m vers l'extérieur et le retour dans l'appartenance cible fonctionne.


3

Cela m'a aidé:

  1. dans le panneau du fichier de projet (côté gauche), sélectionnez le fichier xib qui est endommagé.
  2. Cliquez sur l'icône du propriétaire des fichiers dans la vue de l'éditeur.
  3. dans le panneau des propriétés (côté droit), sélectionnez le troisième onglet (en haut)
  4. spécifier la "Classe personnalisée"

Si vous ne voyez pas de «panneau», jetez un œil dans le coin supérieur droit de la fenêtre et activez les boutons «Afficher» appropriés. Si vous ne voyez pas les boutons "Afficher", cliquez sur le bouton de capsule le plus en haut à droite.


J'avais récemment changé (refactoriser) le nom de la classe. La classe personnalisée mentionnée dans cette réponse était toujours définie sur l'ancien nom. Changé pour le nouveau nom et c'est corrigé.
PaulMrG

2

J'ai remarqué que le fichier .m a été déplacé dans le dossier en.lproj.

Supprimez simplement (référence uniquement) le fichier .m du Xcode et déplacez .m hors de en.lproj. Ajoutez-le à nouveau, cela résoudra le problème.

Ne vous inquiétez pas, vous récupérerez toutes vos connexions.


Mon .m a été généré automatiquement et je ne l'avais pas encore modifié. Je l'ai fait et tout allait bien. Rien d'autre n'avait fonctionné.
entonio

2

J'ai rencontré le même problème aujourd'hui. Le redémarrage de XCode n'a pas résolu le problème pour moi. J'ai pu revenir à la normale en utilisant l' option "Supprimer" de "Données dérivées" du projet qui se trouve sous Organisateur . L'organisateur dit que «les données dérivées incluent l'index, la sortie de construction et les journaux». Je suppose que l' index ou la sortie de construction causaient ce problème.


2

dans XCode, allez dans l'organiseur, cliquez sur projet, cliquez sur supprimer les données dérivées ... puis nettoyez le projet


2

Dans mon cas, cela m'a aidé à faire un "faux changement" (juste un espace) dans le fichier d'en-tête correspondant.


Je pense que cela a pu le faire pour moi aussi. Dans mon cas, j'ai ajouté une prise manuellement. J'ai ensuite pu y connecter mes nouilles, ainsi que créer de nouvelles prises en faisant glisser le curseur.
Daniel Wood

1
  1. ResultCell doit être une sous-classe de UITableViewCell
  2. Vous ne devez pas faire glisser un UIViewsur le canevas vide, vous devez faire glisser unUITableViewCell
  3. Vous devez sélectionner la cellule et la changer pour qu'elle devienne votre sous-classe
  4. Le propriétaire est le plus souvent un contrôleur avec une sortie vers la cellule

Chaque fois que vous souhaitez charger une nouvelle cellule, appelez:

 [[NSBundle mainBundle] loadNibNamed:nibName 
                               owner:controllerWithOutletToCell 
                             options:nil]

après le chargement, utilisez la cellule et réglez l'ivar / sortie sur zéro, prêt pour le prochain chargement

il existe d'autres moyens, mais c'est courant


Si je fais cela, j'ai exactement le même problème. L'Assistant Editor n'affiche pas le .h lorsque je regarde la pointe, et le Ctrl + Glisser ne crée pas le code de sortie, il affiche l'erreur.
Tim Sullivan

2
Utilisez-vous Xcode 4.0.2? Vous pouvez définir manuellement l'éditeur assistant s'il se comporte mal. Je suppose que vous avez redémarré l'application pour retester ce problème (Xcode 4 en profite souvent). On dirait qu'il ne trouve pas les fichiers de classe dans le projet, ou quelque chose est mal nommé - la capitalisation est importante. Le projet est-il en cours de construction? Il s'agit d'une fonctionnalité de très haut niveau qui dépend de la nouvelle technologie de compilateur.
bshirley

Aw, eff moi. Ouais, redémarrer Xcode et cela a immédiatement commencé à fonctionner. «Scuse-moi, je vais tomber sur mon épée maintenant.
Tim Sullivan

1

Peut-être que ce qui a fonctionné pour moi est ceci. (Xcode v4.5)

Cela n'a pas fonctionné

J'essayais de contrôler le glisser dans la définition d'interface de mon .h

@interface SearchViewController : UIViewController

@end

Cela a fonctionné (c'est peut-être ainsi que cela était censé fonctionner, je ne le savais pas auparavant) Voir les crochets ouverts et fermés. Contrôlez le glisser-déposer après le crochet fermé.

@interface SearchViewController : UIViewController
{
}

@end

1

J'ai eu un problème similaire avec un projet écrit en Swift.

Ce qui a fonctionné pour moi a été de configurer l'IBOutlet dans un code comme celui-ci

@IBOutlet var foo: UIView?

puis connectez-le à Interface Builder en le faisant glisser sur le petit cercle qui apparaît juste à côté de la ligne de code.


C'est la SEULE façon dont j'ai pu le faire fonctionner pour moi aussi. Je suivais un tutoriel Apple écrit pour Objective-C (Start Developing iOS Apps Today) et devais connecter le champ de texte New To-Do Item. Enfin, j'ai créé @IBOutlet var textField: UITextField? et connecté à cela, et cela a fonctionné. Utilisation de XCode 6.4
andrewz

1

Aucune des solutions de contournement ci-dessus n'a résolu le problème de connecteur pour moi.J'ai donc mis mon projet d'animal de compagnie en suspens jusqu'à ce que je tombe sur le thread stackoverflow suivant:

https://stackoverflow.com/a/15873770/2846800

J'avais travaillé sur un grand projet dans une version précédente de XCode et j'avais désactivé l'indexation. En réactivant l'indexation, mon problème est maintenant résolu:

defaults delete com.apple.dt.XCode IDEIndexDisable

Je peux maintenant utiliser les fonctionnalités D&D d'Interface Builder. J'espère que cela peut aider les autres ...


1

Ce problème semble être un bogue Xcode qui s'installe surtout lorsque vous remplacez un fichier par un nouveau fichier du même nom. Xcode semble conserver une référence de l'ancien fichier du même nom.

Quoi qu'il en soit, le moyen de résoudre ce problème semble être:

  1. Nettoyer le projet
  2. Cliquez sur (Votre projet) dans la vue Navigateur de projet. Accédez à Compiler les sources sous Phases de construction de la cible pour laquelle vous construisez. Supprimez et rajoutez le fichier .m qui vous pose problème.
  3. Sinon, dans l'inspecteur de fichiers (vue Utilitaires) du fichier NIB, sous Adhésion cible, décochez et revérifiez le nom de la cible.
  4. Redémarrez Xcode pour faire bonne mesure.
  5. Bien sûr, la suppression et l'ajout du fichier .m seuls devraient également résoudre ce problème.

(Les étapes 1 et 2 seules l'ont résolu pour moi.)


0

Si vous avez copié des fichiers d'un autre projet, assurez-vous simplement de cocher la case `` Ajouter aux cibles ''



0

Symptôme similaire, mais cause différente.

Apparemment, j'ai frappé en arrière lorsque le focus était sur la vue de l'assistant, car l'une des lignes de commentaire du modèle de fichier standard allait de // à /, ce qui empêchait la compilation du fichier.

La correction du commentaire a permis au SDK d'analyser le fichier, de le reconnaître comme un UIViewController et de l'ajouter dans la prise.

SO - si vous avez ce problème, faites une compilation ou analysez pour voir s'il y a des erreurs qui doivent être corrigées dans votre fichier .h de contrôleur de vue. ALORS essayez les autres solutions.


0

Cela peut être un vieux sujet, mais juste au cas où quelqu'un aurait le même problème à l'avenir, essayez de supprimer les fichiers .xib, .h et .m associés et créez-en de nouveaux. Pour moi, le UIViewController dans mon fichier .h n'était pas violet et même le backspacing et la saisie n'a pas aidé.


0

Mettez simplement une ligne entre @implementation et @synthesize. La plupart des réponses ici ont cela en commun. Ça a marché pour moi

@implementation 

@synthesize

0

J'ai juste tout essayé ici et rien n'a fonctionné (en utilisant un Developer Preview pour Xcode 5).

La seule chose qui a fonctionné pour moi a été de mettre cette ligne incomplète dans mon fichier d'interface:

@property (nonatomic, weak)

Pour une raison quelconque, l'ajout de prises et d'actions par glisser-déposer à partir d'un .xib a bien fonctionné par la suite.


0

Pour moi, le nettoyage ou la suppression de DerivedData ont résolu le problème.

J'ai essayé de supprimer et de recréer ma classe UIViewController plusieurs fois et j'ai eu le problème encore et encore.

Ensuite, j'ai recréé la classe UIViewController et lui ai donné un nom différent. Cela a résolu le problème pour moi.


0

J'ai eu ce problème et j'ai trouvé une solution non répertoriée ci-dessus.

Dans mon cas, je pouvais voir qu'il y avait quelque chose qui n'allait pas dans le fichier de classe .h car mon contrôleur de vue personnalisé ne reconnaissait pas la classe: UIViewController (il était en noir et non en violet). Tous les autres contrôleurs de vue personnalisés avaient le: UIViewController en violet.

dans mon cas, et peut-être le vôtre, j'avais besoin d'ajouter la classe dans la liste déroulante des cibles / phases de construction / sources de compilation. Le .m doit être ajouté. Tous les autres .m étaient là mais pas celui-ci.

Une fois que je l'ai ajouté, le: UIViewController est apparu en violet et tout a bien fonctionné.


0

Pour mon cas, j'ai plusieurs projets avec d'autres dépendances. J'ai essayé de le résoudre en supprimant les données dérivées ou en redémarrant XCode mais cela ne pouvait pas fonctionner. Au final, j'ai essayé la méthode suivante et ça marche:

Accédez à target> Build Target Architectures Only> et définissez à la fois Debug et Release sur NO.

Définissez cette option pour tous les projets de l'espace de travail et recompilez pour vous assurer qu'il n'y a pas d'autres erreurs. Cela n'a peut-être pas de sens, mais je l'ai fait. Lors de ma compilation, j'ai eu d'autres problèmes tels que des erreurs de l'éditeur de liens et des symboles introuvables.


0

Pour le fichier * .m de cette vue de classe, ouvrez "Afficher l'inspecteur de fichiers" et décochez "Appartenance cible" pour ce projet, puis faites Nettoyer (menu Produit-> Nettoyer) et vérifiez à nouveau "Appartenance cible" pour ce projet

entrez la description de l'image ici


0

En utilisant Swift, j'ai eu un problème similaire. J'ai découvert que les commentaires faisaient partie du problème pour moi.

J'ai exploité le contrôleur de vue par défaut, y ai travaillé, puis créé un deuxième contrôleur de vue en copiant le premier contrôleur entier, en le réduisant à seulement viewDidLoad () et en renommant la classe en TestViewController. Les constructions ont fonctionné, le code exécuté. Tout était bon.

Quand je suis allé faire glisser un UITextField pour créer un point de vente, il ne me le permettait pas. J'ai remarqué que mes commentaires disaient toujours "ViewController.swift", j'ai donc changé le texte du commentaire en "TestViewController.swift" et reconstruit. J'ai pu connecter ma prise!

Je me demande si ce qui s'est passé est que l'indexeur lisait les commentaires ainsi que les noms de classe, et s'est en quelque sorte confus.


0

J'espère que cela aide quelqu'un là-bas.

Je devais simplement supprimer le dossier de données dérivées. Vous devez cliquer sur Fenêtre -> Organiseur -> Projets -> Supprimer les données dérivées

ET REDÉMARREZ XCODE.

Vous devriez être prêt à partir!


0

La nouvelle classe ne faisant pas partie de "TARGET" est probablement la cause profonde de ceci, comme l'ont fait allusion certaines de ces réponses.

Lors de la création d'une nouvelle classe de cacao, par défaut, l'option pour ajouter une nouvelle classe à la cible est cochée par défaut, mais devrait, pour une raison quelconque, ne pas être cochée lorsque vous appuyez sur Enregistrer, vous aurez ce problème.

Nouvelle cible de classe

Chacune de ces solutions de contournement qui ajoutent la nouvelle classe à la cible des applications fonctionnera pour résoudre le problème, et est quelque chose que tous ces «correctifs» ont en commun.

Je pense que XCode a probablement des bogues qui provoquent, par défaut, un nouveau fichier NE PAS être ajouté à la cible principale des applications. Le correctif se résume à l' ajout de votre classe `` cassée '' à la cible principale


0

Dans XCode 7.1, l'ajout du connecteur à un point différent de mon fichier source fonctionnait. L'erreur que je recevais renvoyée à l'une de mes variables comme s'il s'agissait d'une classe (n'avait aucun sens). L'erreur a cessé de se produire lorsque j'ai ajouté le connecteur en dessous de cette variable au lieu d'en haut.


0

Il y a aussi une raison différente au problème ... si vous avez créé un nouveau fichier de classe cacao avec un modèle autre que iOS ... je peux arriver ...

La solution serait de le supprimer et de le recréer avec le bon modèle entrez la description de l'image ici

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.