web-dev-qa-db-fra.com

La classe n'est pas conforme au codage par valeur de clé

Je connais le sens de cette erreur, mais je me bats vraiment avec elle et j'ai besoin de l'aide de quelqu'un:

2010-09-21 15:03:11.562 Stocks[5605:207] *** Terminating app due to uncaught 
exception 'NSUnknownKeyException', reason: '[<NSObject 0x499fb20> 
setValue:forUndefinedKey:]: this class is not key value coding-compliant 
for the key actionText.'

Voici mon code ici:

AlertCell.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>


@interface AlertCell : UITableViewCell {
    IBOutlet UILabel *actionText;
}

@property (retain, nonatomic) UILabel *actionText;

@end

Et 

AlertCell.m

@implementation AlertCell
@synthesize actionText;

- (void)dealloc {
    [actionText release];
    [super dealloc];
}

@end

Le problème se produit juste là:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    AlertCell *cell = 
      (AlertCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AlertCell" 
                                                         owner:nil 
                                                       options:nil];
        for (id oneObject in nib) {
            if ([oneObject isKindOfClass:[UITableViewCell class]]) {
                cell = (AlertCell *)oneObject;
                break;
            }
        }
    }    


    cell.actionText.text = [arrayAlert objectAtIndex:indexPath.row];
    return cell;
}

Sur cette ligne:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AlertCell" 
                                             owner:nil 
                                           options:nil];

Comme demandé, voici mon en-tête pour le TableViewCOntroller: 

#import <UIKit/UIKit.h>


@interface AlertesViewController : UITableViewController {
    NSMutableArray *arrayAlert;
}

Et vous pouvez voir mon fichier XIB (en XML): http://Pastebin.com/FDVzLYZu

@fin

Quelqu'un peut-il m'aider ? Merci beaucoup !

67
Rob

Il existe plusieurs options pour résoudre ce problème - je vous laisse choisir celle qui convient le mieux.

La raison pour laquelle cela échoue est que le propriétaire est passé à zéro. Vous liez la sortie actionText au propriétaire du fichier dans IB, mais lors du chargement de la nib, le propriétaire est nil. J'imagine que lorsque vous chargez un propriétaire nil en coulisse, un objet NSObject est utilisé, ce qui explique pourquoi vous obtenez l'erreur clé/valeur.

Mon conseil précédent de passer la cellule en tant que propriétaire échouerait également car je ne savais pas comment la plume était construite; la cellule est nulle comme vous ne l'avez pas encore créée (et la file d'attente renvoie zéro, donc même la cellule passe puisque le propriétaire passe essentiellement à zéro).

Deux options:

  • Instanciez une nouvelle cellule dans votre implémentation d'indexPath de l'indicateur -cellForRowAtIndexPath: (NSIndexPath *) et transmettez cette nouvelle cellule en tant que propriétaire (mais je suppose que ce n'est pas la meilleure solution pour vous)
  • Ou, et je suggérerais que ce soit la meilleure solution, modifiez la liaison de actionText dans votre fichier nib en la cellule d'alerte et non au propriétaire du fichier (vous avez le propriétaire du fichier et une cellule d'alerte - liez UILabel à la sortie actionText du Cellule d'alerte, et non le propriétaire du fichier, comme c'est le cas actuellement) - je suppose que c'est ce que vous voulez. Dans cet esprit, le propriétaire du fichier peut redevenir un NSObject.

------- La réponse originale conservée ci-dessous car la classe de propriétaire du fichier est également une cause fréquente de cette erreur -------

Cela suggère que vous avez 'instancié' un AlertCell dans InterfaceBuilder, et que vous liez quelque chose à actiontext, mais que la classe n'est pas définie sur AlertCell, c'est toujours NSObject?

Examinez la zone de texte de la classe dans l'onglet Identifier de la palette d'outils pour cet objet dans Interface Builder. La classe devrait être AlertCell, mais je suppose qu'elle est toujours définie sur NSObject.

En passant, et n'hésitez pas à ignorer ce conseil, mais il y a quelques autres choses que je vous encourage à faire, purement d'un attentes/conventions de l'objectif C point de vue:

  • Nommez vos fichiers après votre classe (le premier caractère du nom de fichier en majuscule).
  • Préfixez vos noms de classe; deux caractères majuscules, généralement vos initiales (je l’appellerais par exemple DWAlertCell).
84
dannywartnaby

vous avez probablement basé votre code sur un didacticiel Web tel que celui situé à http://www.e-string.com/content/custom-uitableviewcells-interface-builder ou http: //www.icodeblog. com/2009/05/24/custom-uitableviewcell-using-interface-builder/

Votre problème (et je suis sûr à 99% que c'est là que vous avez trébuché, je viens de commettre la même erreur), c'est que dans le générateur d'interface, vous avez lié vos IBOutlets à partir du propriétaire du fichier, alors que vous devriez les lier à partir de la vue cellule. C'est pourquoi vous obtenez les erreurs.

102
theprof

J'ai eu le même problème, et je ne pouvais pas trouver la variable/élément mentionné dans aucun fichier. J'ai suivi les étapes suivantes.

Environnement: Xcode 6

  • Accédez au fichier Xib et cliquez avec le bouton droit de la souris sur (Ctrl + Clic de souris) sur chaque élément UI Pour voir ses associations.
  • Dans sa section de référencement des prises, vous pourrez localiser l'association Erronée.
  • Supprimer cette association
  • Nettoyer la solution et construire le dossier
  • Réinitialiser le simulateur
  • Reconstruisez et exécutez le projet.
7
Muhammad Umar

check UIControl Référence du nom de la propriété OutLet from nib/StoryBoard File

5
Baljeet Singh

Assurez-vous que la cellule sélectionnée place la classe personnalisée et non le propriétaire du fichier dans le but d'ajouter la classe personnalisée .__ en haut à droite Vue de classe à cellule

4
user2063513

Peut-être que cela aide: Indentity Inspector lorsque vous avez sélectionné le propriétaire du fichier - UITableViewCell, lorsque vous avez sélectionné la cellule dans Objets Votre champ de cellule personnalisé 

3

Au bout de 2 heures, je me suis rendu compte que j'avais oublié de

@synthesize tableView = _tableView;

J'espère que ça aide.

Mário

2
Mário Carvalho
#import <UIKit/UIKit.h>

@interface ReceptionDetailCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *productName;

@property (weak, nonatomic) IBOutlet UILabel *billType;

@property (weak, nonatomic) IBOutlet UILabel *bookTime;

@property (weak, nonatomic) IBOutlet UILabel *doctorName;

@property (weak, nonatomic) IBOutlet UILabel *downBillManName;




@end

Vérifiez le code de la cellule et les paramètres du storyboard, s’ils existent tous, peut-être avez-vous changé leur nom. 

0
Gank