2013-08-08 8 views
0

Je crée cette application mais je ne sais pas comment gérer l'erreur lorsqu'il n'y a pas de valeur pour une entrée donnée dans le NSDictionary. Voici le code que j'ai actuellement:Gestion des erreurs NSDictionary

NSDictionary *entry = [self entries][indexPath.row]; 
    NSDictionary *text = [self entries][indexPath.row]; 
    NSString *user = entry[@"user"][@"full_name"]; 
    NSString *caption = text[@"caption"][@"text"]; 

    if (caption != nil && entry != [NSNull null] && text != nil && caption != [NSNull null]) { 
     RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:user message:caption]; 
     [modal show]; 
    } 

Voici la réponse d'erreur que je reçois quand je tape sur une cellule sans aucune légende:

2013-08-08 02:36:57.871 Floadt[5566:c07] -[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x310b678 
2013-08-08 02:36:57.872 Floadt[5566:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x310b678' 
*** First throw call stack: 
(0x2fda012 0x260be7e 0x30654bd 0x2fc9bbc 0x2fc994e 0x5606b 0x1c7a42f 0x1c8c182 0x1c8c394 0x261f705 0x188693c 0x18869ac 0x261f705 0x188693c 0x18869ac 0x1a401d3 0x2fa2afe 0x2fa2a3d 0x2f807c2 0x2f7ff44 0x2f7fe1b 0x2bb77e3 0x2bb7668 0x1778ffc 0x2d2d 0x2c55) 
libc++abi.dylib: terminate called throwing an exception 
+0

pouvez-vous la structure de votre dictionnaire? –

+0

Superflue ... Tout est superflu dans votre vérification d'erreur, Objective-C n'est pas Java, vous n'avez pas besoin de vérifier «nil». Vous avez omis ** l'essence, ** cependant: 'if ([entry isKindOfClass: [classe NSDictionary]]' 'et' if ([text isKindOfClass: [classe NSDictionary]]) ' –

+0

où ces lignes iraient-elles avec mon code? above @ H2CO3 – Prad

Répondre

0

ne sait pas pourquoi entry et text sont la même chose . Cela pourrait être une faute de frappe qui vous cause des problèmes:

NSDictionary *entry = [self entries][indexPath.row]; 
NSDictionary *text = [self entries][indexPath.row]; 

Ensuite, vous devez vraiment utiliser isEqual pour vos chèques à l'égalité (même si seulement pour vous empêcher d'entrer dans les mauvaises habitudes) et vérifier les valeurs obtenues (vous n » t vérifier actuellement user):

if (![user isEqual:[NSNull null]] && ![caption isEqual:[NSNull null]]) { 

Vos chèques actuels sont pour la plupart redondants - vous devez vérifier les choses avant de les utiliser, pas après. Vérification entry et text doit être fait plus tôt. Ensuite, vérifiez user et caption.

0

Pourquoi vous utilisez deux NSDictionary mais ils stockent même valeur [self entries][indexPath.row]?

Modifier votre contrôle comme suit

if (!caption && ([entry isKindOfClass:[NSDictionary class]]) && ([text isKindOfClass:[NSDictionary class]]))