Xcode - Comment corriger 'NSUnknownKeyException', raison:… cette classe n'est pas conforme au codage des valeurs de clé pour l'erreur de clé X "?

1173

J'essaie de lier un UILabelavec un IBOutletcréé 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.'

Guillaume Dubois
la source
11
pedrotorres a raison. Oui c'est bien cela. Si vous faites un UITableViewCell, dans IB n'oubliez pas de faire le propriétaire du fichier à NSObject et le UITableViewCell'Class à la classe .h que vous avez définie.
giuseppe
3
Lorsque vous rencontrez un tel problème et que la clé incriminée est une action plutôt qu'une sortie, vous avez très probablement une sortie qui référence par erreur le nom de votre fonction d' action au lieu du nom de la variable de sortie .
Alex Yursha
2
Vous devriez noter que le nom de la clé dans le message d'erreur (l'OP l'appelle 'XXXX') est le nom que vous avez donné à quelque chose dans votre fichier nib. Cela devrait aider à affiner votre recherche.
kris
J'ai déposé rdar: // 22105925 demandant à Apple de rendre ces erreurs plus évidentes au moment de la construction. :)
jtbandes
comment résoudre IMMÉDIATEMENT le problème! stackoverflow.com/a/13812660/294884 astuce fantastique
Fattie

Réponses:

980

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

'NSUnknownKeyException', raison: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: cette classe n'est pas conforme au codage des valeurs de clé pour la chaîne de clé.'

Cela est dû au fait que le Secondcontrôleur de vue a MainWindow.xibune classe de UIViewControllerau 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 .hfichier.

Retirez - le dans .xibou .storyboardla 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 (of foo.storyboard):

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

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ème

Hassan Tareq
la source
9
N'oubliez pas non plus de connecter la sortie "view" de la plume à la sortie view du propriétaire du fichier (la sortie view de votre classe personnalisée héritée de UIViewController). Cela peut être fait en faisant glisser le contrôle de "Propriétaire du fichier" sous "Espace réservé" vers "Affichage" sous "Objets" et en sélectionnant la sortie de la vue.
Nirma
1
Je me suis assuré que toute la classe est déjà définie, mais la NSUnknownKeyException sort toujours :(
Zennichimaro
1
Je n'utilise même pas Interface Builder et j'obtiens toujours cette erreur. Une idée de ce qui se passe?
sudo
12
Ça ne fait rien. C'était à cause de deux choses: Xcode accédait toujours à mon storyboard principal même s'il avait été supprimé du projet, et le simulateur l'avait mis en cache. Je déconseille fortement d'utiliser des storyboards ou des NIB - ils sont ridiculement problématiques.
sudo
5
@Josh Lol. Chaque fois que je trouve la motivation pour créer une application native dans xcode, cela se termine toujours par moi qui passe une journée à essayer de comprendre comment faire quoi que ce soit. Je suis ac # dev donc j'ai récemment regardé les offres de Xamarin et Telerik (nativescript).
The Muffin Man
1524

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:

  1. Sélectionnez l'objet dans IB et accédez à l '«Inspecteur des connexions».
  2. 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.

    entrez la description de l'image ici

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

  1. Ouvrez votre storyboard et faites un clic droit sur le bouton UIButton
  2. 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":

    exemple 2

OhadM
la source
1
Merci! Dans mon cas, j'avais 2 prises pour la même vue, et se débarrasser de l'ancienne et brancher la vue sur la nouvelle a mis fin à l'exception.
Mark Patterson
le mien a été dupliqué deux fois. J'ai commencé à déconnecter chacun après avoir fait glisser et déposé une version Pro (à partir d'une version Lite) en pensant qu'il était accroché aux connexions de l'autre projet. Lorsque je suis tombé sur le doublon, et qu'il a fallu 3 clics pour effectuer la déconnexion, je souhaitais sincèrement l'avoir fait 3 jours plus tôt. Oh bien, telle est la vie d'un dev.
aremvee
J'ai eu le problème que UIButton avait plus d'une affectation. Cela a résolu mon problème.
mythicalcoder
J'ai eu ce problème également. N'oubliez pas de vérifier les connexions des prises dans des vues particulières au lieu de seulement des superviews. Dans mon cas, les aperçus ne montraient pas les mauvaises connexions = /
Augusto Carmo
J'ai eu une erreur similaire lorsque j'ai connecté une prise de bouton à un mauvais fichier swift ViewController dont la page n'aurait pas encore été créée à l'aide de l'interface graphique
brw59
114

J'ai dû supprimer l'application du simulateur / iPhone pour me débarrasser de cette erreur.

Steve Rogers
la source
1
+1 cela m'a corrigé. Je nettoyais un code qui utilisait IB. Lorsque j'ai supprimé un bouton du code, l'erreur a continué d'apparaître même lorsque ce bouton n'était pas du tout référencé dans les fichiers nib (du moins que je pouvais voir).
Dimanche Lundi
2
Je trouve cela nécessaire si vous déboguez deux applications qui ont le même nom.
Anton
Oui, il semble que quelque chose du XIB soit mis en cache sur le simulateur, ce qui est pénible si vous testez des mises à niveau car vous ne voulez pas avoir à supprimer l'ancienne application.
Carlos P
J'ai eu ce problème lors de la suppression de mon fichier XIB. Cela a résolu le problème.
balboa
4
Si la suppression de l'application ne fonctionne pas, essayez de supprimer le dossier XCode DerivedData. qui peut mettre en cache un fichier xib incorrect. Ouvrez XCode -> Préférences -> Emplacements -> Ouvrez le dossier DerivedData et faites-le glisser dans la corbeille.
Philip Fung
107

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. Supprimer les connexions dans l'inspecteur lorsque le propriétaire du fichier est mis en surbrillance

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 connexion doit être ici lorsque la cellule d'affichage de la table est mise en surbrillance

uplearnedu.com
la source
4
Cela l'a fait pour moi, merci beaucoup. J'ai supprimé les connexions lorsque "Propriétaire du fichier" a été sélectionné dans la colonne de gauche, puis j'ai sélectionné ma cellule personnalisée et les ai reconnectées. Succès!
Rogare
Même avec xcode7, cela fonctionne, utilisez simplement le panneau de droite "Inspecteur des connexions". Retirez la sortie de la cellule de table et de l'étiquette, puis ajoutez-la à nouveau et tout devrait fonctionner.
lifeisfoo
3
Cela fonctionne mais vous devez vous assurer que FileOwner n'a pas été configuré !! Le propriétaire du fichier doit rester NSObject. stackoverflow.com/questions/13793162/…
devjme
La même réponse m'a sauvé deux fois!
wm.p1us
99

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.

entrez la description de l'image ici

Shruti Thombre
la source
Cette réponse m'a aidé pour un cas spécifique. Je dois continuer à travailler sur un ancien projet obj-c avec plusieurs cibles. Je crée un UITableViewCell personnalisé dans Swift et j'ai eu la même erreur. En activant "Hériter de la cible", cela a fonctionné. Je vous remercie!
magohamoth
Le module n'est pas toujours réglé correctement; par exemple, si vous remplissez le nom de la classe avant de créer réellement la classe.
Johan
J'ai rempli le nom de la classe sans appuyer sur la touche "Entrée" à la fin, l'IDE n'a donc pas vérifié ce drapeau automatiquement. Gaspillé 1 heure à ce sujet. Je vous remercie.
MatPag
Jamais rencontré ce type d'erreur dans obj-c. Mais merci son résolu le mystère.
Pradeep Kachhawaha
pourquoi est-ce enterré dans la 3ème page?
Sergio
65

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.

erkanyildiz
la source
2
Oui, c'était tout pour moi. Tout en essayant d'ajouter un nouveau contrôleur de vue de démarrage, je l'ai défini sur la nouvelle classe / nib. Après avoir branché la prise de vue, je rencontrais cette erreur. Effacer ce champ l'a corrigé.
terriblememory
Cela a fonctionné pour moi. Notez que j'ai également dû supprimer l'ancienne version de l'appareil / simulateur pour qu'elle fonctionne.
jimt
Merci - c'était mon problème. J'avais renommé mon fichier de storyboard iPad et je n'ai pas mis à jour les préférences de mon projet.
RobertJoseph
2
Je vous remercie! Cela l'a résolu pour moi. (J'ai dû supprimer l'application du simulateur après avoir modifié le champ Interface principale pour qu'il soit vide. Le simple fait de modifier ce champ n'a pas forcé le simulateur à casser le cache.)
snipe
Je me suis souvenu que j'avais changé les choses d'une application universelle à une application uniquement pour iPhone et cela corrigeait l'erreur!
Justin
59

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.

entrez la description de l'image ici

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

Tibidabo
la source
Je vous remercie! Cela m'a arrangé. J'ai ce problème depuis longtemps et je ne savais pas comment le résoudre autrement que de recommencer à zéro. C'était le cas, a supprimé les IBOutlets du contrôleur de vue, mais ne savait pas qu'ils étaient toujours référencés / liés dans le propriétaire (dans ce cas, "Contrôleur de vue" dans le générateur d'interface - Xcode 6).
Ira Herman
41

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.

entrez la description de l'image ici

Eric Brotto
la source
37

dans mon cas, il s'agissait d'une erreur dans le code source du storyboard, procédez comme suit:

  1. ouvrez d'abord votre story-board en tant que code source
  2. rechercher <connections>
  3. supprimer les connexions indésirables

Par exemple:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

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

tarif namrouti
la source
33

entrez la description de l'image ici entrez la description de l'image ici

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.

ashack
la source
Ayyy dag nab it ... Je ne peux pas croire à quelle fréquence je fais cette erreur. Merci lol
Benjamin
31
  1. Vous n'avez qu'à spécifier IBOutletune fois, l' IBOutletétiquette de votre ivar n'est pas nécessaire.
  2. Instanciez-vous votre NIB en utilisant votre UIViewController? À un moment donné, vous devriez appeler[SecondView initWithNibName:@"yourNibName" bundle:nil];
kubi
la source
Cela a aidé! J'obtenais une erreur de conformité de codage de valeur-clé concernant une propriété d'un autre contrôleur de vue. Il s'avère que j'appelais -initWithNibNameavec le mauvais nom de plume.
jlstrecker
Oui , cela m'a aidé aussi .. Je l'utilisais UIViewController au lieu de MyCustomeViewController .. mais ce genre de question est la hiérarchie peut être .. l'introspection a échoué en raison de la miss placé objet de classe .. Merci de toute façon
Futur
J'ai eu un problème similaire. Deux entrées IBAction identiques par accident. Ne s'affiche pas dans le code, seulement dans le clic droit de l'UIControl (Un UIStepper dans mon cas). La suppression d'un seul l'a corrigé.
Dave Hubbard
30

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.

Maj
la source
Cela résout mon problème. tsk2x près de 3 jours de maux de tête.
user3818576
5
Il fournit une réponse à la question. Quelque chose a été gâché dans Nib et faire un nettoyage l'a résolu. J'ai lu et essayé tout ce qui précède en vain, puis j'ai fait le nettoyage, et après 1 heure d'essayer de le réparer, la solution de Maj l'a corrigé. J'aurais adoré voir ce qui dans le XML aurait pu causer cela, mais j'ai continué.
LevinsonTechnologies
Cela résout en effet le problème - j'ai essayé de nombreuses suggestions ci-dessus et seul le projet a corrigé cette erreur qui s'est soudainement produite. Ugg ...
DustinB
Cela résout mon problème, j'ai essayé beaucoup de suggestions ci-dessus. Semble étrange!
Naveen Shan
23

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:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Au lieu de cela:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

DeviceViewController

Le nom de ma classe était-il également appelé

DeviceViewController.h 
DeviceViewController.m

Tu devras

"import DeviceViewController.h"

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:

    [self presentViewController:deviceViewController animated:YES completion:nil];
Yannis
la source
MERCI pour toutes les étapes là-bas, j'utilisais Xcode 5 et je ne savais pas vraiment comment ajouter manuellement une plume car vous ne pouvez ajouter que le storyboard par défaut .... J'ai quelques instructions mais pas aussi détaillées que les vôtres. Vraiment aidé !!
Pittfall
"J'ai mal fait ça ..." merci, ce n'est pas la première fois que je dépense beaucoup à cause de cette erreur vraiment stupide
tontonCD
23

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.

Ilansky Naftali
la source
Merci! Je suis un n00b sur Xcode et il m'a fallu un certain temps pour trouver les liens voyous. Dans Xcode 9.2, vous pouvez cliquer avec le bouton droit de la souris sur l'élément dans la vue du storyboard et vérifier les "Référencement des prises".
kunigami
21

En regardant les autres réponses, il semble que de nombreuses choses peuvent provoquer cette erreur. En voici un de plus.

Si vous

  • avoir une vue personnalisée
  • a ajouté une propriété @IBInspectable
  • puis supprimé plus tard

Ensuite, vous pouvez également obtenir une erreur similaire à

Échec de la définition de la propriété inspectée définie par l'utilisateur (xxx) sur [Votre vue personnalisée] ...: cette classe n'est pas conforme au codage des valeurs de clé pour la clé [xxx].

La solution consiste à supprimer l'ancienne propriété.

entrez la description de l'image ici

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

Suragch
la source
Je suis venu si souvent sur cette page ... Cette fois, cette solution a réussi! Mais aussi étrange que cela puisse paraître, l'ancienne propriété à supprimer se trouvait en fait sur un autre ViewController que celui qu'elle plante, je ne sais pas pourquoi.
Cinn
15

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:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

La solution lors de sa création par programme peut être la suivante:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}
neoneye
la source
12

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.

ercu
la source
voter car il en était ainsi dans mon cas. J'utilise Swift et Storyboards. Lorsque j'ai créé une nouvelle cible de build (pour créer une variante de build), l'application ne fonctionnait pas dans la nouvelle variante alors que la première fonctionnait bien. L'application s'est écrasée sur un contrôleur de vue où le nom du module était en quelque sorte défini sur module à partir de la première cible, tandis que dans le fonctionnement des contrôleurs de vue, il était Actuel - <nom du module ici> . Dans ce cas, vous devez effacer le nom du module.
Mixaz
11

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

David Carney
la source
9

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 NSObjectet les utilisaient setValue:forKey. Chaque fois que j'ai setValue:forKeyessayé 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 avec setValue:forKey.

Finalement, j'ai commencé à commenter toutes ces setValue:forKeylignes et j'ai constaté que mon defaultcas de déclaration de commutateur fonctionnait String?.

J'ai finalement compris que vous ne pouvez pas utiliser de types Swift optionnels à setValue:forKeymoins qu'ils aient un mappage direct vers un type Objective-C comme String?ou NSNumber?. J'ai fini par changer tous les CShort?types en NSNumber?ayant un mappage direct. Car Bool?dans mon cas, c'était bien pour moi de simplement l'utiliser Boolet de l'initialiser false. 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:

Vous ne pouvez pas utiliser KVC sur une propriété Int facultative, car KVC est Cocoa / Objective-C et Objective-C ne peut pas voir un Int facultatif - il n'est pas ponté vers Objective-C. Objective-C ne peut voir que les types reliés à Objective-C:

types de classe dérivés de NSObject

types de classe exposés avec @objc

Structures rapides pontées

AtheistP3ace
la source
1
Si vous essayez de connecter une valeur booléenne Swift via des liaisons Cocoa, vous devez l'exposer avec la directive @objc; sinon vous obtenez en effet cette erreur. Ce devrait être la meilleure réponse.
jvarela
9

"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

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Manière correcte

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Je n'ai trouvé aucune réponse comme ci-dessus, donc cela peut aider quelqu'un ayant le même problème

Muhammad Ammad
la source
8

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.

MehrozKarim
la source
8

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.

kubilay
la source
7

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.

Jason
la source
7

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.

  1. Vérifié que le bouton était connecté à la bonne action (ce n'était pas le problème, mais toujours bon à vérifier)
  2. Vérifiez que le bouton ne comporte aucune action ou sortie supplémentaire que vous avez créée par erreur. (Ce n'était pas le problème, mais toujours bon à vérifier)
  3. Vérifiez les journaux et assurez-vous que tous les boutons de l'ÉCRAN SUIVANT ont les actions correctes, et s'il y a des séquences, assurez-vous qu'ils ont un identifiant unique. (C'était le problème)
    • L'une des séquences n'avait pas d'identifiant unique
    • L'un des boutons avait une action et deux prises que j'ai créées par erreur.
    • Supprimez tous les points de vente supplémentaires et assurez-vous que les séquences vers l'écran suivant ont des identifiants uniques.

À votre santé,

Ronaldoh1
la source
6

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:

  1. Mettez en surbrillance votre fichier .m.
  2. Dans le volet droit, sélectionnez l'inspecteur de fichiers.
  3. Dans la section "Target Membership", assurez-vous que la cible de génération appropriée est cochée.

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

Mike M. Lin
la source
6

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.

Damo
la source
Cela a fonctionné lors de la copie et du collage d'une scène dans l'éditeur de Storyboard.
Mizmor
5

Dans mon cas. Je n'avais pas de sorties manquantes dans les fichiers xib après la fusion.

Maj + Commande + K

résolu mon problème. J'ai nettoyé mon projet et reconstruit.

utilisateur123456
la source
4

Dans mon cas, cela a été causé par le référencement de la mauvaise Nib:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
wspruijt
la source
1
Cela m'arrive lorsque je renomme la classe du contrôleur de vue et oublie que le nom de la nib doit également changer. Comme le nom de la nib n'est qu'une chaîne, il n'y a pas d'erreur de compilation.
kris
3

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.

Symétrique
la source
J'ai de nouveau cette erreur. Cette fois, j'ai créé un nouveau contrôleur de vue de table vide avec ma classe qui lui est affectée, laissant celui qui ne fonctionne pas, et j'ai déplacé la séquence vers lui. Cela a fonctionné. J'ai ensuite copié lentement chaque élément de la vue jusqu'à ce qu'il échoue à nouveau. Cette fois, le problème s'est avéré que j'avais assigné des "Attributs d'exécution définis par l'utilisateur" à un sélecteur (je pensais que je pourrais les utiliser pour initialiser le sélecteur afin de ne pas avoir à le faire en code, aucune idée si c'est possible ). La suppression de ce problème a résolu le problème. Cette erreur est vraiment horrible, j'espère qu'elle sera améliorée dans une future version!
Symétrique
3

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.

priya
la source