2010-04-25 8 views
0

j'avoir du succès quand j'utiliser ce code pour obtenir une chaîne à partir d'un tableau de noms de fichier appelé « fileList »:générer un objectForKey d'un tableau

cell.timeBeganLabel.text = [[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]; 

donc je me attendais le même code pour générer la même chaîne comme une clé pour moi dans ce:

NSDictionary *stats = [thisRecordingsStats objectForKey:[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 
    cell.durationLabel.text = [stats objectForKey:@"duration"]; 

ou ceci:

NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 

deux construire sans erreur, et t Le journal montre que mes données sont là: mais je reçois un UILabel vierge.
N'ai-je pas écrit le générateur de clé dynamique correctement?

+0

Vous avez vérifié que thisRecordingStats et stats sont non-nil? – nall

+0

Oui, le NSLog montre le contenu de thisRecordingsStats est { "4:37:13 PM, 25 avril" = { FILEPATH = "/ Utilisateurs/brian/Bibliothèque/Application Support/iPhone Simulator/3.1.3/Applications/8287F6FC -3965-4E26-A214-E47C0C9B5687/Documents/4: 37: 13 PM, avril 25.aif "; durée = "00:05"; etc. – Brian

+0

stats est nul, mais pas si mettre une valeur spécifique pour la clé. – Brian

Répondre

2

Je vais avoir le succès quand j'utiliser ce code pour obtenir une chaîne à partir d'un tableau de noms de fichier appelé « fileList »:

cell.timeBeganLabel.text = [[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]; 

Ainsi, le résultat de cette expression de message est votre clé, non? En d'autres termes, les clés de votre dictionnaire sont-elles des noms de fichiers sans extensions?

donc je me attendais le même code pour générer la même chaîne comme dans la clé pour moi ceci:

NSDictionary *stats = [thisRecordingsStats objectForKey:[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 
cell.durationLabel.text = [stats objectForKey:@"duration"]; 
  1. Vous Calculons le nom du fichier sans extension comme avant.
  2. Vous recherchez l'objet pour cette chaîne dans le dictionnaire thisRecordingsStats, obtenant ainsi un autre dictionnaire, avec lequel vous initialisez la variable stats.
  3. Vous recherchez l'objet pour la clé "durée" dans le dictionnaire stats et définissez le durationLabeltext à cet objet.

ou ceci:

NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 

Ajout de la partie @"%@", n'a pas de sens, puisque objectForKey: ne prend pas une chaîne de format. Comparez the documentation for NSString's stringWithFormat: method à the documentation for NSDictionary's objectForKey: method.

Le code "fonctionne" car ce que vous avez passé comme argument à objectForKey: est une expression de virgule. L'opérateur virgule de C évalue les deux côtés et évalue sur le côté droit. Cependant, dans ce cas comme dans la plupart des autres, cela n'ajoute rien. Pour des raisons comme celle-ci, l'opérateur de virgule est rarement utilisé et encore plus rarement utilisé exprès.

Coupez la pièce @"%@",.

Retour au problème:

deux construire sans erreur, et le journal montre mes données sont là: mais je suis obtenir un UILabel vide.

Eh bien, vous dites la clé que vous générer de la chaîne dans votre tableau fileList apparaît dans le UILabel, de sorte que le problème est l'un de ceux-ci:

  • thisRecordingStats est nil.
  • thisRecordingStats ne contient pas d'objet pour la clé que vous avez générée à partir de la chaîne dans self.fileList.
  • thisRecordingStats contient un objet pour la clé que vous avez généré à partir de la chaîne dans self.fileList, et il s'agit d'un dictionnaire, mais il ne contient pas de valeur pour la clé "durée".
  • thisRecordingStats contient un objet pour la clé que vous avez généré à partir de la chaîne dans self.fileList, et il s'agit d'un dictionnaire, et il contient une valeur pour la clé "durée", mais cette valeur est une chaîne vide (longueur nulle).

Vous devez également vérifier la console du débogueur pour les messages qui suggèrent d'autres problèmes. Par exemple, un message "ne répond pas au sélecteur" peut être dû au fait que thisRecordingStats contient un objet pour la clé que vous avez générée à partir de la chaîne dans self.fileList, mais ce n'est pas un dictionnaire.

Enfin, je suggère de construire une ou plusieurs classes model object au lieu de dictionnaires d'imbrication comme celui-ci. Cela tend à rendre le code beaucoup plus facile à lire et à déboguer. En particulier, les dictionnaires qui ont ostensiblement des objets pour la "durée" clé devraient être des objets modèles.

+0

ouah! merci pour votre réponse généreuse. En plus de créer un objet modèle, pourriez-vous suggérer un moyen d'obtenir le contenu de objectAtIndex: 1 du tableau interne en dehors de la journalisation du tableau externe en tant que tel: thisRecordingsStats est { "5:45:02, April 26 "= ( " /Users/.../Documents/5:45:02 PM, April 26.aif ", " 00:04 ", etc. Ma meilleure estimation actuelle est: NSArray * stats = [ thisRecordingsStats objectForKey: key]; \t cell.durationLabel.text = [stats objectAtIndex: 0] – Brian

+0

Je ne vois pas de tableau interne Le dictionnaire contient un tableau comme valeurs, mais le tableau contient des chaînes (au moins autant que vous le montriez dans cet extrait.) Rappelez-vous que les tableaux dans Cocoa sont strictement sériels, non t associatif; les tableaux ne sont pas des dictionnaires. –