L'application iPhone plante avec NSUnknownKeyException setValue:forUndefinedKey :[dupliquer]

StackOverflow https://stackoverflow.com/questions/46220

  •  09-06-2019
  •  | 
  •  

Question

J'écris ma première application iPhone, donc je n'ai pas encore trouvé grand-chose en matière de débogage.Essentiellement, mon application affiche une image et, lorsqu'elle est touchée, émet un son court.Lors de la compilation et de la construction du projet dans XCode, tout se construit avec succès, mais lorsque l'application est exécutée dans le simulateur iPhone, elle plante.

J'obtiens 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 voici l'image que j'utilise pour l'arrière-plan.

Je ne suis pas sûr de ce que signifie NSUnknownKeyException ou pourquoi la classe n'est pas conforme au codage des valeurs de clé pour la clé.

Était-ce utile?

La solution

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

NSUnknownKeyException est une erreur courante lors de l'utilisation Codage clé-valeur pour accéder à une clé que l'objet ne possède pas.

Les propriétés de la plupart des objets Cocoa sont accessibles directement :

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

Ou via le codage clé-valeur :

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

J'obtiendrais une NSUnknownKeyException si j'utilisais la ligne suivante :

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

car NSString n'a pas de propriété (clé) appelée « purpleMonkeyDishwasher ».

Quelque chose dans votre code essaie de définir une valeur pour la clé « kramerImage » sur un UIView, qui (apparemment) ne prend pas en charge cette clé.Si vous utilisez Interface Builder, cela peut provenir de votre plume.

Trouvez où « kramerImage » est utilisé et essayez de le retrouver à partir de là.

Autres conseils

De plus, lorsque vous renommez une vue, n'oubliez pas de supprimer la référence sur le propriétaire du fichier.Cela peut également générer cette erreur.

En voici un où vous obtiendrez cette erreur – et comment la corriger.Je l'obtenais lors du chargement d'une plume qui venait d'avoir un TableViewCell personnalisé.J'ai utilisé IB pour créer un xib contenant uniquement le propriétaire du fichier, le premier répondant et TableViewCell.Le TableViewCell avait juste 4 UILabels qui correspondaient à une classe avec 4 IBOutlet UILabels appelée rootCell.J'ai changé la classe de TableViewCell en rootCell.Cela a bien fonctionné jusqu'à ce que j'apporte quelques modifications et que tout à coup, j'obtenais le setValue:forUndefinedKey :quand j'étais en train d'instancier la classe après l'avoir chargée à partir d'un nib :

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

    cell = [nib objectAtIndex:0];

Il a échoué à la première ligne, lorsque la plume essayait de se 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 avertissement.Ce que j'ai fait de mal, c'est de changer par inadvertance le propriétaire du fichier en classe rootCell.Lorsque je l'ai remplacé par 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 du propriétaire du fichier un NSObject, mais faites de UITableCell la classe souhaitée.

J'ai eu cette situation et il s'avère que même après avoir trouvé toutes les instances de la variable et les avoir supprimées, mon application plante toujours.Voici ce qui s'est passé...J'ai créé une autre instance d'une variable à partir 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 je l'ai supprimée.Il s'avère que mon programme a vu cela et a continué à essayer de l'utiliser dans le programme, donc à l'avenir, si cela se produit ailleurs, allez simplement dans votre XIB, faites un clic droit sur le bouton ou le champ de texte, etc. et supprimez toutes les variables supplémentaires inutilisées.

J'ai eu ce même problème aujourd'hui.Je n'avais pas spécifié la bonne classe pour le View Controller dans mon contrôleur de navigation.Cela se produira souvent si vous ne parvenez pas à spécifier la classe correcte pour vos vues dans Interface Builder.

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

C'est ainsi que j'ai résolu le mien, dans Interface Builder, cliquez avec le bouton droit sur View Controller, il devrait y avoir un point d'exclamation sur la prise ou la méthode d'action manquante.Trouvez et supprimez toutes les références et cela a résolu le problème.

Cela s'est produit parce que j'ai supprimé la méthode d'action dans le fichier .m.

Il semble que tu fasses

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

Ensuite, après avoir synthétisé cette vue d'image, lorsque vous ouvrez "MyFirstIphoneAppViewController.xib" dans Interface Builder, vous prenez une vue d'image à partir de l'outil (menu)/Bibliothèque en reliant cette prise à "InitialkramerImage" du propriétaire des 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".Donc après avoir fait ça

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

et en enregistrant le projet lorsque vous l'exécutez, il n'existe aucune sortie de "InitialkramerImage" dans "MyFirstIphoneAppViewController.xib".Ainsi, lorsque vous exécutez le projet, il n'y aura aucun référencement de sortie d'Imageview au « kramerImage » et

"Pour afficher la vue, UIViewController essaiera de trouver la sortie pour" initialKramerimage "qui n'est pas existant."

Ainsi, il lancera la « NSUnknownKeyException ».

Vous pouvez vérifier la sortie manquante en ouvrant le fichier NIB (.xib) puis en cliquant avec le bouton droit sur le «propriétaire des fichiers» de cela.

Si vous avez créé ce code ailleurs et que vous aviez un fichier zip/compressé, essayez de l'extraire à nouveau.Cela peut fonctionner, je ne sais pas pourquoi, mais j'ai l'impression que c'est un problème d'extraction.

ou vous pouvez essayer de changer IBOutlet en KramerImage et de le lier à nouveau dans NIB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top