Question Qu'est-ce que ça veut dire? "'NSUnknownKeyException', raison: ... cette classe n'est pas un code-clé compatible avec la clé X"


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?

*** Terminaison de l'application due à une exception non interceptée 'NSUnknownKeyException', raison: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: cette classe n'est pas conforme à la valeur clé codage-conforme pour la clé XXX.'


983


origine


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

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

Il est causé par le Second voir le contrôleur dans MainWindow.xib avoir une classe de UIViewController au lieu de SecondView. Le passage à la classe correcte résout le problème.

D'ailleurs, c'est une mauvaise habitude d'avoir des noms comme "string" en Objective-C. Il invite une collision de nommage d'exécution. Évitez-les même dans les applications de pratique une fois hors. 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: lorsque vous copiez et collez des é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 modifié et relié cet élément dans le nouveau contrôleur.


807



Vous pouvez avoir une mauvaise connexion dans votre xib.

J'ai eu cette erreur plusieurs fois. Tandis que la réponse de TechZen est absolument juste dans ce cas, une autre cause commune est quand vous change 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 'Referencing Outlets' assurez-vous que votre objet n'est pas encore connecté à l'ancien nom de la propriété ... si c'est le cas, cliquez sur le petit 'x' pour supprimer la référence et construire à nouveau.

    example 1

Une autre cause fréquente 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 l'UIButton
  2. Vous verrez qu'il y a plus d'un assign / ref à ce bouton. Enlevez l'une des fenêtres grisées "Main ..." avec le petit "x":

    example 2


1397



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


101



J'ai eu cette erreur lorsque j'essayais d'implémenter un ViewCell personnalisé pour une table. Lorsque j'ai mis en surbrillance le contrôleur de vue pour le XIB et connecté aux éléments dans le CellView a provoqué l'erreur "cette classe n'est pas la clé codage-conforme pour la clé" une fois que j'ai supprimé ces il s'est débarrassé de l'erreur.

Supprimez les connexions dans l'image ci-dessous. Delete the connections in inspector when File Owner is highlighted

Assurez-vous juste que vous avez seulement les connexions avec la cellule de vue de table. Pour vérifier cliquez sur la cellule de vue de la table et dans INSPECTOR recherchez vos connexions.

The connection should be in here when Table View Cell is highlighted


84



S'il s'agit d'une application pour iPhone uniquement, pas universelle, assurez-vous que le champ suivant est vide:

Cibles> Résumé> Infos sur le déploiement iPhone / iPod> Interface principale

Si vous spécifiez un xib, il se bloque.


61



Cette erreur indique qu'un Interface Builder déjà connecté l'objet est supprimé / renommé dans la source de son propriétaire (propriétaire du fichier).

Contrôle-clic sur le Propriétaire du fichier dans l'Interface Builder si vous voyez un point d'exclamation vous devez corriger cela.

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.

enter image description here

Cela donne l'erreur suivante: Terminaison de l'application en raison d'une exception non interceptée 'NSUnknownKeyException', raison: '[setValue: forUndefinedKey:]: cette classe n'est pas compatible avec la valeur de clé pour la clé aRemovedView. '


56



J'ai eu le même problème et même si la réponse de TechZen peut effectivement être incroyable, j'ai eu du mal à l'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 de fichier.

J'espère que cela t'aides.

enter image description here


40



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. enter image description here


39



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 tags xml de mise en page de storyboard;)


33



Cela ne m'arrivait que lors du débogage sur un appareil (iPhone). Le simulateur iOS fonctionnait correctement. Faire un "Produit-> Propre" de Xcode semblait résoudre le problème, mais je ne sais pas pourquoi.


29



  1. Vous avez seulement besoin de spécifier IBOutlet une fois la IBOutlet étiqueter votre ivar est inutile.
  2. Instanciez-vous votre NIB en utilisant votre UIViewController? À un moment donné, vous devriez appeler [SecondView initWithNibName:@"yourNibName" bundle:nil];

27