Utilisation d'AVAudioPlayer avec un fichier plist
Babyfoot34
Membre
Bonjour a tous
Je n'arrive pas a passer ma valeur contenue dans mon fichier plist et dans un NSDictionary (qui est bien rempli puisque je le controle avec la console). Je me doute que cela doit etre ridicule mais je debute compleyement dans la prog. Alors soyez indulgent SVP.
Voici mon code
J'ai mis en gras ce que je n'arrive pas a trouver (c.a.d le contenue de mon premier champs dans mon NSDictionary qui est le nom de mon fichier mp3 soit exemple.mp3)
Merci pour votre aide
[EDIT modo]Pense à utiliser la balise [tt][co[/tt][tt]de]...[/co[/tt][tt]de][/tt] quand tu rédiges ton message (ou le bouton "#" au dessus des smileys et de la zone de texte où tu tapes ton message) pour une meilleure lisibilité du code
Je n'arrive pas a passer ma valeur contenue dans mon fichier plist et dans un NSDictionary (qui est bien rempli puisque je le controle avec la console). Je me doute que cela doit etre ridicule mais je debute compleyement dans la prog. Alors soyez indulgent SVP.
Voici mon code
#import "FirstViewController.h"<br />#import <AVFoundation/AVFoundation.h><br /><br /><br />@implementation FirstViewController<br /><br />@synthesize Ecouter, audioPlayer;<br />@synthesize path, Mots, dict;<br /><br />int lectureOn =0;<br /><br />- (IBAction)Ecouter: (id) sender{<br /> <br /> //Chemin de fichier (plist) ou se trouvent les données<br /> path = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; <br /> <br /> NSLog(@"Chemin du Plist: %@", path);<br /> <br /> NSError *error;<br /> <br /> //Remplissage du tableau avec les donnée du fichier plist<br /> dict = [[NSDictionary alloc] initWithContentsOfFile:path];<br /> <br /> if (dict == nil)<br /> NSLog(@"Tableau vide", [error description]);<br /> else<br /> <br /> //NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];<br /> <br /> for (id key in dict) {<br /> NSLog(@"key: %@, value: %@", key, [dict objectForKey:key]);<br /> }<br /> <br /> audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: /*[b]*/[dict objectForKey:key]];/*[/b]*/<br /> // audioPlayer.numberOfLoops = -1;<br /> <br /> if (audioPlayer == nil)<br /> NSLog(@"Erreur :", [error description]);<br /> else<br /> [audioPlayer play]; <br /> lectureOn =1;<br /> <br /> }<br />
J'ai mis en gras ce que je n'arrive pas a trouver (c.a.d le contenue de mon premier champs dans mon NSDictionary qui est le nom de mon fichier mp3 soit exemple.mp3)
Merci pour votre aide
[EDIT modo]Pense à utiliser la balise [tt][co[/tt][tt]de]...[/co[/tt][tt]de][/tt] quand tu rédiges ton message (ou le bouton "#" au dessus des smileys et de la zone de texte où tu tapes ton message) pour une meilleure lisibilité du code
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bien sûr tu as un [tt]for(id key in dict)[/tt] mais qui déclare "key" (comme "id") que dans le scope de la boucle "for". D'ailleurs le compilateur du coup devrait te remonter une erreur genre "unknown variable key" après ta boucle for quand tu utilises [tt][dict objectForKey:key][/tt] puisqu'une fois la boucle for terminée, la variable "key" n'est plus dans le 'scope' donc n'est plus déclarée... (s'il ne te met pas d'erreur de compilation c'est bizarre)
Remplace 'key' dans ton [tt][dict objectForKey:key][/tt] par la vraie clée, la NSString quoi, genre [tt]@mp3file[/tt] ou je ne sais quoi
Je te donne un appercu de se qui apparait dans la console
J'ai un autre probleme (comme tu peux le voire) avec les caracteres en cyrilique. ils sont tres bien affichés dans le plist mais pas du tout compris par le NSDictionary
Ceci etant dit, mon but est de pouvoir lire le fichier contenu dans "audio_fr" lorsque je clique sur mon bouton.
Il y a une centaine de fichiers mp3 a lire c'est pour cette raison que je cherche une solution avec un tableau ou un dictionnaire pour pouvoir conserver la meme vue pendant toute la lecture du fichier plist
J'espere etre assez claire (mais la c'est pas gagner) je sais
Merci quand meme pour vos post
Christophe
voila le code refait et un peu corriger mais je ne comprend pas les 2 warning
merci pour votre aide
[code/]
- (IBAction)Ecouter: (id) sender{
//Chemin de fichier (plist) ou se trouvent les données
path = [[NSBundle mainBundle] pathForResource:@Data ofType:@plist];
//Remplissage du tableau avec les donnée du fichier plist
dict = [[NSDictionary alloc] initWithContentsOfFile:path];
//NSString *valeur = [[dict objectForKey:1] valueForKey:@Audio_Fr];
NSDictionary *fiche_2 = [dict objectForKey:1]; // le 1er c'est 0, le 2e c'est 1
NSString *valeur = [fiche_2 valueForKey:@Audio_Fr];
//Boucle pour afficher mes valeurs dans la console
for (id key in dict) {
NSLog(@key: %@, value: %@", key, [dict objectForKey:key]);
}
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:valeur] error:NULL];
[audioPlayer play];
lectureOn =1;
}
[code/]
NSDictionary *fiche_2 = [dict objectForKey:1];
warning: passing argument 1 of 'objectForKey:' makes pointer from integer without a cast
et
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:valeur] error:NULL];
warning: local declaration of 'valeur' hides instance variable
Donc ça aucun problème.
C'est le [tt]objectForKey[/tt] que tu as mis APRES la fin de la boucle for qui n'était pas normal, c'est un peu comme si tu mettais [tt][dict objectForKey: ploufplouf][/tt] mais que tu n'as jamais défini ce qu'était ploufplouf. Dans ce cas tu devrais avoir une erreur de compilation, si tu n'en as pas soit c'est qu'il y a un bug dans le compilateur qui laisse passer ça alors qu'il ne devrait pas, soit c'est que tu n'as pas recopié exactement ton code comme tu l'as dans ton .m... Car pour le coup d'après le code de ton premier post, "key" n'est plus déclaré/défini à ce moment là , et même si sa déclaration qui a été faite dans le "for" avant était par hasard encore considérée comme valable par le compilateur, on se demande bien quelle valeur aurait cette variable 'key'... sans doute la dernière valeur qu'il a prise à la dernière itération de la boucle for, mais même si c'était le cas c'est pas du tout ce que tu veux !
Non je ne pense pas que ce soit un vrai problème. La console (et donc les messages écrits par NSLog) c'est comme un terminal, c'est pas prévu pour afficher des caractères avec des diacritiques ou des caractères Unicode, du coup il ne saura pas toujours t'afficher correctement dans la console un "é" ou autre chose, tu verras pas un joli texte en clair pour ces cas particuliers d'accents. Mais ça veut pas dire que ce n'est pas le bon contenu.
Au contraire même, puisqu'il t'affiche des "\Uxxxx" pour chaque caractère cyrillique, ce qui est la notation normale d'un caractère Unicode générique. Donc quand il t'affiche "\U043e" dans la console par exemple, il faut comprendre ça comme "ici y'a le caractère Unicode dont le codepoint vaut 043e (en hexa), que la console ne saura pas afficher proprement car elle ne sait afficher que des caractères ASCII mais c'est bien le bon caractère".
D'ailleurs si tu consultes une Table Unicode qui liste tous les codepoints unicodes (équivalent des codes ASCII pour les encodages US-ASCII) existant et le caractère auquel ils correspondent, on voit que les codepoints \U0400 à \U04FF correspondent en effet à la tranche des caractères cyrilliques (et que ton \U043e par exemple correspond à une lettre ressemblant fort à notre 'o' minuscule latin). Donc tes caractères sont bien compris par le NSDictionary c'est juste que la console ne sait pas écrire/afficher des caractères en cyrillique (et en Unicode de manière générale) c'est pour ça qu'il te l'affiche comme ça. D'ailleurs tu as bien fait de mettre tes données dans un PLIST car tu n'aurais pas pu les mettre par exemple directement dans le code ou autre, les fichiers de code (.h, .m) n'étant pas en Unicode...
Si tu affiches le même texte dans un UILabel par exemple, il s'affichera correctement sur l'iPhone.
Bon j'avance doucement mais j'avance
voici ma derniere PONTE :P
et cette fois cela fonctionne. J'ai plcacé quelques commentaires pour les autres débutant
Ben Zut Flut et Pomme d'Apple ... ca ne marche pas la musique
???
Il faut absolument charger dans le .h et le .m AudioToolBox car sinon le fichier son marche sur le simulateur mais pas sur l'Iphone. Je ne sais pas pourquoi mais avec cette Framework cela fonctionne. Deplus mon fichier son fonctionne avec NSDATA.
Aller bonne chance a tous