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"];
- Vous Calculons le nom du fichier sans extension comme avant.
- Vous recherchez l'objet pour cette chaîne dans le dictionnaire
thisRecordingsStats
, obtenant ainsi un autre dictionnaire, avec lequel vous initialisez la variable stats
.
- Vous recherchez l'objet pour la clé "durée" dans le dictionnaire
stats
et définissez le durationLabel
text
à 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.
Vous avez vérifié que thisRecordingStats et stats sont non-nil? – nall
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
stats est nul, mais pas si mettre une valeur spécifique pour la clé. – Brian