2008-09-05 17 views
18

Je suis en train d'écrire ma première application pour iPhone, donc je n'ai pas eu beaucoup à faire pour résoudre les problèmes de débogage. Essentiellement mon application affiche une image et lorsqu'il est touché joue un son court. Lors de la compilation et de la construction du projet en XCode, tout se construit avec succès, mais lorsque l'application est exécutée dans le simulateur de l'iPhone, elle plante.L'application iPhone plante avec NSUnknownKeyException setValue: forUndefinedKey:

je reçois l'erreur suivante:

Application Specific Information: 
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331) 
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.' 

kramerImage est l'image ici, je me sers pour l'arrière-plan.

Je ne suis pas sûr de savoir ce que signifie NSUnknownKeyException ou pourquoi la classe n'est pas compatible avec le codage de valeur de clé pour la clé.

Répondre

22

(Ce n'est pas vraiment spécifique à l'iPhone - la même chose se produira dans le Cocoa ordinaire).

NSUnknownKeyException est une erreur fréquente lors de l'utilisation de Key-Value Coding pour accéder à une clé que l'objet n'a pas.

Les propriétés de la plupart des objets de cacao peuvent être accédaient directement:

[@"hello world" length] // Objective-C 1.0 
@"hello world".length  // Objective-C 2.0 

ou par codage des valeurs-clés:

[@"hello world" valueForKey:@"length"] 

je recevrais un NSUnknownKeyException si je la ligne suivante:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"] 

car NSString n'a pas de propriété (clé) appelée 'purpleMonkeyDishwasher'. Quelque chose dans votre code tente de définir une valeur pour la clé 'kramerImage' sur un UIView, qui (apparemment) ne supporte pas cette clé. Si vous utilisez Interface Builder, il se peut que ce soit quelque chose dans votre plume.

Trouvez où 'kramerImage' est utilisé, et essayez de le suivre à partir de là.

+2

Je reçois cette erreur, et c'est quelque chose à voir avec interfacebuilder, mais je n'arrive pas à comprendre comment le réparer. – bentford

+1

Merci pour cela - un autre gaspillé 3 heures finalement fixé. :) –

+0

J'avais ce problème dans la situation où j'avais copié des fichiers d'un projet à l'autre. Mon xib fait référence au mauvais nom de classe. Cette réponse m'a donné assez d'infos pour un moment d'eureka, alors merci. – Grumdrig

10

Lorsque vous renommez une vue, n'oubliez pas de supprimer la référence sur le propriétaire du fichier. Cela peut aussi provoquer cette erreur.

+1

+1 cela m'est arrivé . J'ai renommé la variable pour mon MKMapView et tout d'un coup BAM! NSUknownUknownKeyException. – ladookie

+0

Storyboard avait un bouton lié à rien qui a causé l'erreur KeyValue. Cela a résolu mon problème. Merci! –

8

En voici une où vous obtiendrez cette erreur - et comment la réparer. Je l'obtenais lors du chargement d'une plume qui avait juste un TableViewCell personnalisé. J'ai utilisé IB pour construire un xib qui avait juste le propriétaire du fichier, First Responder, et le TableViewCell. Le TableViewCell avait juste 4 UILabels qui correspondaient à une classe avec 4 UILabels IBOutlet appelé rootCell. J'ai changé la classe de TableViewCell pour être rootCell. Il a bien fonctionné jusqu'à ce qu'un fait quelques changements et tout à coup je devenais le setValue: forUndefinedKey: quand je ne faisais que instanciation de la classe après le chargement d'une pointe:

NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil]; 

    cell = [nib objectAtIndex:0]; 

Il a échoué à la première ligne, lorsque le nib essayait de charger. Après un moment, j'ai remarqué qu'il essayait de faire correspondre les étiquettes IBOutlet au contrôleur racine, PAS à la classe rootCell! C'était mon avis. Ce que j'ai mal fait était de changer par inadvertance le propriétaire du fichier en classe rootCell. Quand je l'ai changé en NSObject, il n'a pas essayé de correspondre au délégué (rootController) lors du chargement. Donc, si vous faites ce qui précède, faites en sorte que le propriétaire du fichier soit un objet NSObject, mais faites de la classe UITableCell votre classe souhaitée.

+0

+1 Et notez à moi-même et toute autre personne qui _always_ oublie ceci: lors de l'utilisation de loadNibNamed: owner: options :, le propriétaire du fichier doit être NSObject, la vue principale doit être votre type de classe, et tous les points de vente doivent être connectés à la vue , _pas_ le propriétaire du fichier. – Echelon

+0

Merci Owen, j'ai lutté avec exactement la même situation. Résolu comme décrit. Merci beaucoup! – Khiet

0

Il semble que vous faites

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *InitialkramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage; 

Puis, après la synthèse que imageview, Lorsque vous ouvrez « MyFirstIphoneAppViewController.xib » dans Interface Builder, vous prenez une vue sur l'image de l'outil (menu)/liaison den bibliothèque qui sortie vers le 'InitialkramerImage' à partir du propriétaire de fichiers de "MyFirstIphoneAppViewController.xib". Ensuite, vous avez enregistré le projet. Mais après cela, vous pouvez changer le nom de la variable de sortie "InitialkramerImage" en "kramerImage". Ainsi, après avoir fait cette

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *kramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage; 

et sauver le projet lorsque vous l'exécutez, Il n'y a pas de existance la sortie de « InitialkramerImage » dans le « MyFirstIphoneAppViewController.xib ». Donc, lorsque vous exécutez le projet il n'y aura pas de sortie de référence Imageview à la « kramerImage » et

"For displaying the view, UIViewController will try to find the outlet to "InitialkramerImage" which is not existing."

Ainsi, il lancera le « NSUnknownKeyException ».

You can check the missing outlet by opening the nib(.xib) file then right clicking on the 'Files Owner' of that.

2

J'ai eu ce même problème aujourd'hui. Je n'avais pas la bonne classe spécifiée pour le contrôleur de vue dans mon contrôleur de navigation. Cela arrive souvent si vous ne spécifiez pas la classe correcte pour vos vues dans Interface Builder.

Vous rencontrerez également des problèmes de sélection incorrects. Vérifiez toujours vos classes et connexions Interface Builder!

+0

Merci. J'avais la classe spécifiée correctement dans IB, mais il y avait une discordance entre mon contrôleur et la plume que j'ai spécifiée dans initWithNibName: - Je devrais avoir mes droits copy + paste révoqués. – masty

+0

Il suffit de retourner au dojo iOS et pratiquez votre copie + pâte-fu. – gonzobrains

0

Si vous avez fait ce code ailleurs et que vous avez un fichier zip/compressé, essayez de l'extraire à nouveau. Cela peut fonctionner je ne sais pas pourquoi mais je me sens comme c'est un problème d'extraction. Ou vous pouvez essayer de remplacer l'objet IBOutlet par kramerImage et le lier à nouveau dans NIB.

2

J'ai eu cette situation et il s'avère même après avoir trouvé toutes les instances de la variable et en les supprimant, mon application est toujours tombée en panne. Voici ce qui s'est passé ... J'ai créé une autre instance d'une variable d'un champ de texte de mon XIB dans mon viewController.h mais j'ai réalisé que je n'en avais plus besoin et l'ai supprimé. Il s'avère que mon programme a vu cela et a continué à essayer de l'utiliser dans le programme si à l'avenir, si cela se produit ailleurs, allez simplement dans XIB, faites un clic droit sur le bouton ou textfield etc et supprimez toutes les variables inutilisées supplémentaires.

2

Voici comment j'ai résolu le mien, dans le constructeur d'interface, cliquez avec le bouton droit de la souris sur le contrôleur de vue. Il devrait y avoir un point d'exclamation sur la sortie ou la méthode d'action manquante. Trouver et supprimer toutes les références et qui l'ont résolu.

Cela est dû au fait que j'ai supprimé la méthode d'action dans le fichier .m.