J'essaie de lier un UILabel
avec un IBOutlet
créé dans ma classe.
Mon application plante avec l'erreur suivante.
Qu'est-ce que ça veut dire?
Comment puis-je le réparer?
*** Arrêt de l'application en raison d'une exception non interceptée 'NSUnknownKeyException', raison: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: cette classe n'est pas conforme au codage des valeurs de clé pour la clé XXX.'
ios
macos
cocoa
cocoa-touch
interface-builder
Guillaume Dubois
la source
la source
Réponses:
Votre contrôleur de vue peut avoir la mauvaise classe dans votre xib.
J'ai téléchargé votre projet.
L'erreur que vous obtenez est
Cela est dû au fait que le
Second
contrôleur de vue aMainWindow.xib
une classe deUIViewController
au lieu deSecondView
. Le passage à la classe correcte résout le problème.Soit dit en passant, c'est une mauvaise pratique d'avoir des noms comme "chaîne" dans Objective-C. Il invite une collision de noms d'exécution. Évitez-les même dans des applications d'entraînement uniques. Les collisions de noms peuvent être très difficiles à localiser et vous ne voulez pas perdre de temps.
Une autre raison possible de cette erreur: lors de la copie et du collage d'éléments d'un contrôleur dans un autre, Xcode conserve en quelque sorte ce lien vers le contrôleur d'origine, même après avoir édité et relié cet élément dans le nouveau contrôleur.
Une autre raison possible de cette erreur:
Mauvaise sortie.
Vous avez supprimé ou renommé un nom de point de vente dans votre
.h
fichier.Retirez - le dans
.xib
ou.storyboard
la connexion de fichier inspecteur.Une raison de plus possible
(Dans mon cas) Extension d'UIView avec des propriétés pouvant être liées et définissant des valeurs pour ces propriétés pouvant être liées (c.-à-d. Ombre, rayon de coin, etc.), puis supprimez ces propriétés de l'extension UIView (pour une raison quelconque), mais les éléments suivants sont
<userDefinedRuntimeAttributes>
restés en xml (offoo.storyboard
):Lösung: Clic droit sur
foo.storyboard
> s'ouvrir comme code source> rechercher par keyPath (c.-à-d. ShadowRadius)> supprimer celui</userDefinedRuntimeAttributes>
qui cause le problèmela source
Vous pouvez avoir une mauvaise connexion dans votre xib.
J'ai eu cette erreur plusieurs fois. Bien que la réponse de TechZen soit absolument exacte dans ce cas, une autre cause courante est lorsque vous changez le nom d'une propriété IBOutlet dans votre .h / .m que vous avez déjà connecté au propriétaire du fichier dans la plume.
De votre plume:
Sous "Référencement des prises", assurez-vous que votre objet n'est pas encore connecté à l'ancien nom de propriété ... s'il l'est, cliquez sur le petit "x" pour supprimer la référence et reconstruire.
Une autre cause courante si vous utilisez Storyboard, votre UIButton peut avoir plus d'une affectation (la solution est presque la même que pour nib):
Vous verrez qu'il y a plus d'un assign / ref à ce bouton. Supprimez l'une des fenêtres "Principales ..." grisées avec le petit "x":
la source
J'ai dû supprimer l'application du simulateur / iPhone pour me débarrasser de cette erreur.
la source
J'ai eu cette erreur lorsque j'essayais d'implémenter une ViewCell personnalisée pour une table. Lorsque j'ai mis en surbrillance Contrôleur de vue pour le XIB et connecté aux éléments dans le CellView a provoqué l'erreur "cette classe n'est pas conforme au codage de la valeur de clé pour la clé" une fois que je les ai supprimés, elle s'est débarrassée de l'erreur.
Supprimez les connexions dans l'image ci-dessous.
Assurez-vous simplement que vous ne disposez que des connexions avec la cellule Table View. Pour vérifier, cliquez sur la cellule de vue de table et dans INSPECTOR recherchez vos connexions.
la source
Parfois, cela a à voir avec votre "hériter de la cible". Cette valeur doit être définie. Avec les applications à cible unique, vous pouvez simplement sélectionner Hériter de la cible. Si vous avez plus d'une cible, sélectionnez la cible souhaitée.
la source
S'il s'agit d'une application iPhone uniquement, pas universelle, assurez-vous que le champ suivant est vide:
Cibles> Résumé> Informations sur le déploiement iPhone / iPod> Interface principale
Si vous spécifiez un xib, il se bloque.
la source
Cette erreur indique qu'un objet Interface Builder déjà connecté est supprimé / renommé dans la source de son propriétaire (propriétaire du fichier).
Contrôle-cliquez sur le propriétaire des fichiers dans le générateur d'interface si vous voyez un point d'exclamation dont vous avez besoin pour résoudre ce problème.
Dans l'image ci-dessous, vous pouvez voir que "aRemovedView" a un point d'exclamation sur sa droite, c'est parce que j'ai supprimé l'objet de vue IBOutlet alors qu'il était déjà connecté dans l'IB.
Cela donne l'erreur suivante: Arrêt de l'application en raison d'une exception non interceptée 'NSUnknownKeyException', raison: '[setValue: forUndefinedKey:]: cette classe n'est pas conforme au codage de la valeur de clé pour la clé aRemovedView.'
la source
J'ai eu le même problème et bien que la réponse de TechZen puisse en effet être incroyable, j'ai eu du mal à m'appliquer à ma situation.
Finalement, j'ai résolu le problème en liant l'étiquette via le contrôleur répertorié sous Objets (mis en évidence dans l'image ci-dessous) plutôt que via le propriétaire du fichier .
J'espère que cela t'aides.
la source
dans mon cas, il s'agissait d'une erreur dans le code source du storyboard, procédez comme suit:
<connections>
Par exemple:
Comme vous le voyez, ce sont des connexions entre les noms de vos variables de code et les balises xml de la disposition du storyboard;)
la source
Ma solution était similaire à celle de Gerard Grundy. Lors de la création d'un UITableViewCell personnalisé à l'aide d'un XIB, j'avais appliqué par erreur le nom de la classe personnalisée au propriétaire du fichier au lieu de l'UITableViewCell. L'application de la classe à UITableViewCell sur le canevas et la connexion de mes propriétés IBOutlet à celui-ci ont résolu le problème.
la source
IBOutlet
une fois, l'IBOutlet
étiquette de votre ivar n'est pas nécessaire.UIViewController
? À un moment donné, vous devriez appeler[SecondView initWithNibName:@"yourNibName" bundle:nil];
la source
-initWithNibName
avec le mauvais nom de plume.Cela ne m'arrivait que lors du débogage sur un appareil (iPhone). Le simulateur iOS fonctionnait bien. Faire un "Produit-> Nettoyer" à partir de Xcode a semblé résoudre le problème, mais je n'ai aucune idée pourquoi.
la source
J'ai eu exactement le même message d'erreur et merci (!!) à Kira de http://www.idev101.com J'ai pu résoudre le défi. Je n'ai trouvé son site qu'après avoir googlé et empilé tous ces fils. Je poste maintenant ici pour le prochain qui vient sur StackOverFlow et qui a le même défi que moi, car cette personne viendra très probablement sur ce sujet via Google.
J'ai réalisé que j'avais mal fait ceci:
Au lieu de cela:
Où
Le nom de ma classe était-il également appelé
Tu devras
dans votre implémentation (fichier .m) où vous voulez appeler par exemple un autre UIViewController.
Je ne suis absolument pas désolé si je déclare uniquement l'évidence pour des débutants comme moi et que je peux obtenir des votes car cela n'est pas exactement lié à la question mais je cherchais 4 heures (?!?) Directement pour la réponse à ce message d'erreur . Si je peux épargner cela à 1 ou 2 personnes, ce serait génial :)
PS: Pour ceux intéressés par la façon dont le code continue pour charger les autres UIViewController:
la source
Cela peut provenir du fait que vous avez fait glisser le contrôle et créé une sortie ou une action, et que vous avez oublié de le supprimer. Même si vous avez supprimé le code, ou même si vous avez créé suffisamment de cmd + Z, vous devrez vous rendre dans l'inspecteur de connexion de votre storyboard et voir si l'action ou la sortie que vous avez créée est toujours là ou non.
la source
En regardant les autres réponses, il semble que de nombreuses choses peuvent provoquer cette erreur. En voici un de plus.
Si vous
Ensuite, vous pouvez également obtenir une erreur similaire à
La solution consiste à supprimer l'ancienne propriété.
Ouvrez l'inspecteur d'identité de votre classe, sélectionnez le nom de la propriété sous Attributs d'exécution définis par l'utilisateur et appuyez sur le bouton moins (-).
la source
Cela m'arrive lorsque mon contrôleur de vue avait à l'origine un fichier .xib, mais qu'il est maintenant créé par programme.
Même si j'ai supprimé le fichier .xib de ce projet. Les utilisateurs iPhone / iPad peuvent contenir un fichier .xib pour ce viewcontroller.
La tentative de chargement d'un fichier .xib provoque généralement ce blocage:
La solution lors de sa création par programme peut être la suivante:
la source
La propriété "Module" de View Controller dans l'inspecteur d'identité peut être différente de ce que vous attendiez. Assurez-vous également que de nouvelles classes sont ajoutées à votre liste cible.
la source
J'ai eu un problème similaire pour un projet qui a deux cibles (avec leur propre MainWindow XIB). Le problème fondamental qui a provoqué cette erreur pour moi était que la classe UIViewController n'était pas incluse dans la liste des ressources du deuxième projet. C'est-à-dire que le constructeur d'interface m'a permis de le spécifier dans MainWindow.xib, mais au moment de l'exécution, le système n'a pas pu localiser la classe.
C'est-à-dire cmd-cliquez sur la classe UIViewController en question et vérifiez qu'elle est incluse dans l'onglet 'Targets'.
la source
Juste pour ajouter à cela, car je recevais également cette erreur. En parcourant toutes ces réponses, la plupart semblent s'appliquer à l'utilisation de l'interface utilisateur et des éléments du storyboard. Je sais que l'affiche originale semble fonctionner avec l'interface utilisateur, mais lors de la recherche des raisons possibles de cette erreur, la plupart des questions reviennent à cette question, les autres étant fermées en tant que doublons ou ayant simplement des problèmes avec la connexion des choses dans un storyboard, donc je vais ajoutez ma solution.
Je travaillais sur le codage d'un service Web dans Swift 2. J'avais construit tous les objets proxy et stubs nécessaires. Pendant que je parcourais le XML retourné, j'instanciais dynamiquement mes objets, qui provenaient tous de
NSObject
et les utilisaientsetValue:forKey
. Chaque fois que j'aisetValue:forKey
essayé de définir une propriété, il a explosé avec cette erreur.J'ai eu une instruction switch pour chaque type que je traitais (par exemple
Bool?
,CShort?
,String?
) et pour chaque noeud XML , je suis passé par et vérifié ce que le type était sur l'objet puis converti la valeur à ce type et a tenté de le régler avecsetValue:forKey
.Finalement, j'ai commencé à commenter toutes ces
setValue:forKey
lignes et j'ai constaté que mondefault
cas de déclaration de commutateur fonctionnaitString?
.J'ai finalement compris que vous ne pouvez pas utiliser de types Swift optionnels à
setValue:forKey
moins qu'ils aient un mappage direct vers un type Objective-C commeString?
ouNSNumber?
. J'ai fini par changer tous lesCShort?
types enNSNumber?
ayant un mappage direct. CarBool?
dans mon cas, c'était bien pour moi de simplement l'utiliserBool
et de l'initialiserfalse
. D'autres peuvent ne pas avoir ce luxe.Quoi qu'il en soit, un mal de tête qui, si tout va bien, cela aide quelqu'un d'autre qui a un problème similaire et continue à être redirigé vers cette question et à se dire: "Je ne fais rien dans l'interface utilisateur !!".
Enfin, pour réitérer une fois de plus, le codage valeur-clé ne fonctionne pas avec les options. Ci-dessous, j'ai fini par trouver quelque part mais j'oublie où donc à quiconque a posté cela, je m'excuse et je donnerais le crédit si je me souvenais où j'ai trouvé cela, mais cela m'a sauvé la vie:
la source
"cette classe n'est pas conforme au codage de la valeur de clé pour la clé" Je sais que c'est un peu tard mais ma réponse est différente, donc je pense qu'elle doit être publiée, je poussais le deuxième contrôleur de manière incorrecte, voici un exemple
Mauvaise façon de pousser le contrôleur
Manière correcte
Je n'ai trouvé aucune réponse comme ci-dessus, donc cela peut aider quelqu'un ayant le même problème
la source
Cela peut être le cas du référencement d'un composant de l'interface Xib que vous avez renommé ou supprimé. Le re-référencement fonctionne pour moi.
la source
Je viens d'avoir ce problème dans mon projet dupliqué et résolu en vérifiant 2 endroits:
1- Assurez-vous d'avoir le fichier .m dans la liste -> Projet - Phases de construction - Compiler les sources
2- Après cela, allez dans le constructeur d'interface (c'est probablement une erreur qui se produit avec seulement IB) et dissociez toutes les propriétés, étiquettes, images , etc ... Puis reconnectez tout. J'ai réalisé que j'avais supprimé un attribut mais il était toujours lié dans IB.
J'espère que cela fonctionne pour certains.
la source
Un autre problème "non conforme" que j'ai trouvé était quand j'ai réussi à avoir deux copies d'une classe pour une raison quelconque.
J'ajoutais des clés à la mauvaise copie. Interface Builder a toujours vu les clés et m'a permis de m'y connecter, mais au moment de l'exécution, il utilisait l'autre copie de la classe qui n'avait pas les nouvelles clés.
Pour trouver quelle était la "bonne" copie, j'ai utilisé le cmd-click de XCode sur le nom de la classe ailleurs pour passer à la copie correcte, puis j'ai tué les mauvaises copies inutilisées (après avoir apporté mes modifications de la copie inutilisée en premier).
Morale de l'histoire: les fichiers de classe en double sont mauvais.
la source
Cette erreur est autre chose!
Voici comment je l'ai corrigé. J'utilise xcode version 6.1.1 et j'utilise swift. J'ai cette erreur à chaque fois que mon application a essayé d'effectuer une séquence pour passer à l'écran suivant. Voici ce que j'ai fait.
À votre santé,
la source
J'ai eu le même symptôme. La cause principale était que «l'appartenance à la cible» pour mon fichier source n'était pas définie sur la cible correcte. Je suppose que cela signifie que ma classe ne serait pas construite et incluse dans mon application.
Pour le corriger:
J'espère que cela aide quelqu'un là-bas.
la source
Si vous avez une sous-classe UIViewController personnalisée avec IBOutlets qui causent des problèmes, le seul ensemble d'étapes que j'ai trouvé pour se débarrasser de l'erreur était
.1 Changez la classe en UIViewController
.2 Débrancher toutes les prises (elles auront toutes maintenant le triangle d'avertissement jaune) - il suffira peut-être de déconnecter les prises problématiques.
.3 Suivez toutes les étapes standard - ↑ ⌘K, supprimez les données dérivées (, tapis de prière, perles d'inquiétude)
.4 Lancez l'application - accédez à la scène problématique.
.5 Arrêtez l'application, revenez à Interface Builder, modifiez la classe en utilisant votre nom de classe personnalisé.
.6 Rebranchez vos prises.
Lancez l'application et cela aura normalement résolu les problèmes de conformité des valeurs-clés.
la source
Dans mon cas. Je n'avais pas de sorties manquantes dans les fichiers xib après la fusion.
résolu mon problème. J'ai nettoyé mon projet et reconstruit.
la source
Dans mon cas, cela a été causé par le référencement de la mauvaise Nib:
la source
J'obtenais cette erreur avec les storyboards. La solution ci-dessus ne semble pas être le problème, donc j'ai fini par supprimer le contrôleur de vue et l'ajouter à nouveau (et bien sûr reconnecter la séquence et réaffecter la classe) qui l'a corrigé. Je ne sais pas ce que c'était vraiment, mais j'avais renommé la classe de contrôleur de vue associée peu de temps avant que cela ne commence, alors peut-être que cela avait arrosé quelque chose.
la source
J'ai le même problème. J'ai réinitialisé le simulateur. Suppression et ajout d'un contrôle de bouton. et finalement fait un nettoyage. :) Merci au débordement de pile. Un peu comment mon code est devenu correct et a commencé à fonctionner.
la source