Chargement de listes de questions ?
Bonjour, je suis newbies (
) comme vous avez pu le voir dans ma présentation, et je suis entrain de créer un projet ou j'ai besoin de faire appel à une vingtaine de questions aléatoirement à partir d'une base d'environ 100 questions. Dans un premier temps pour comprendre comment je devrais faire, j'ai d'abord fait le tuto (quizz pour iphone) de ceetix dispo sur weecast et je commence à comprendre un peu (je suis long à la détente) !!!
Mon problème est principalement basé sur le fait que si je fait mes questions avec des "if" et des "if else" ca va etre assez vite le bordel et que mon code va légèrement prendre de l'embonpoint donc je souhaiterait les importer via un fichier .plist. Pensez-vous que cela serait la meilleure technique, sinon comment feriez-vous ?
Mon second problème est qu'en fait, mes questions pourront aléatoirement avoir de trois à sept réponses symbolisé chacune par un bouton nommer "a, b, c, d, e, f, g" jusqu'à la pas de problème mais moi je souhaiterait faire juste appel seulement aux boutons dont j'ai besoin pour chaque questions : c'est à dire j'ai une questions qui nécessite 4 réponses, donc je fait apparaitre les boutons a, b, c et d !!!
L'inconvénient dans tous ca, c'est que mes boutons sont représenté par des custom boutons representer chacun d'eux par une image se nommant a.png, b.png, c.png, d.png, e.png, f.png, g.png !!!
Voila zai tout dit et zespère que vous zavez tout compris !!!

Mon problème est principalement basé sur le fait que si je fait mes questions avec des "if" et des "if else" ca va etre assez vite le bordel et que mon code va légèrement prendre de l'embonpoint donc je souhaiterait les importer via un fichier .plist. Pensez-vous que cela serait la meilleure technique, sinon comment feriez-vous ?
Mon second problème est qu'en fait, mes questions pourront aléatoirement avoir de trois à sept réponses symbolisé chacune par un bouton nommer "a, b, c, d, e, f, g" jusqu'à la pas de problème mais moi je souhaiterait faire juste appel seulement aux boutons dont j'ai besoin pour chaque questions : c'est à dire j'ai une questions qui nécessite 4 réponses, donc je fait apparaitre les boutons a, b, c et d !!!
L'inconvénient dans tous ca, c'est que mes boutons sont représenté par des custom boutons representer chacun d'eux par une image se nommant a.png, b.png, c.png, d.png, e.png, f.png, g.png !!!
Voila zai tout dit et zespère que vous zavez tout compris !!!
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Moi je l'aurai fait via un petit JSON ou XML que j'aurai parsé ensuite.
Dedans tu mets les informations que tu as genre nombres de réponses disponibles etc ... Comme ça après tu sauras directement combien de boutons afficher.
Pourquoi ce choix ? avantage , désavantage ?
Ensuite pour tirer au sort 20 questions parmi ton tableau de question (chargé par [tt]questions = [NSArray arrayWithContentsOfFile:NSBundle mainBundle] pathForResource:@"questions" ofType:@"plist";[/tt]), il suffit de tirer un chiffre au hasard entre 0 et [tt][questions count][/tt], de mémoriser ce chiffre dans un tableau questionsAPoser, et de réitérer l'opération jusqu'à ce qu'on ait 20 questions. Ou plutôt dans un NSMutableIndexSet, qui est une classe justement faite pour contenir des index d'éléments et permet d'éviter d'avoir des doublons (et de risquer de poser 2x la même question donc).
Enfin, pour les boutons de réponses, il n'y a rien de compliqué. Un IBOutlet par bouton qui va te permettre d'accéder à chacun de tes boutons a,b,c,d,e,f,g et t'as juste à modifier leur propriété "hidden" selon le nombre de réponses pour chaque.
A ce stade self.questionsAPoser contient 20 index de questions.
Ensuite quand tu vas parcourir ce NSIndexSet pour récupérer l'index à chaque itération et faire [tt][self.questions objectAtIndex: idx][/tt] pour récupérer la question, tu pourras pour chaque question configurer la visibilité de tes boutons : Voilà pour le principe
Dans tous les cas de toute façon tout mettre dans un fichier externe est la bonne solution.
Après Ceetix je comprend pas du tout ton argumentaire : que ce soit un JSON ou un XML ou un PLIST ça change rien ça n'a rien à voir avec le fait d'avoir un fichier déporté ou non : on peut tout à fait mettre un PLIST sur un serveur, qui dit fichier déporté sur le serveur ne dit pas forcément XML ou JSON... Après si tu fais ça en WebService c'est effectivement bien plus courant et logique de faire XML ou JSON plutôt que PLIST si tu as un service que tu requêtes pour chaque question par exemple... mais là ce n'est plus du tout le même fonctionnement puisqu'il faut alors déployer le WebService et donc coder la partie Web... Par contre si tu héberges le fichiers sur un serveur juste pour que l'appli puisse télécharger le fichier complet (pour pouvoir le mettre à jour régulièrement) genre charger "http://monserveur.com/questions.plist", bah que ce soit un PLIST ou un XML ou un JSON ça change rien, et c'est même plus simple en PLIST car en XML faut utiliser le parseur SAX de l'iPhone, et en JSON faut utiliser une librairie tierce... D'autant que le PLIST, il peut être au format binaire et non au format XML ou ASCII, ce qui le rend encore plus compact...
Bref, pour moi le choix s'orienterait vers le PLIST, et après mettre le PLIST dans le bundle et donc qu'il soit encapsulé dans l'application, ou le mettre sur un serveur pour permettre les mises à jour, ou même les deux (un PLIST fourni de base, et une vérification de mises à jour avec téléchargement du PLIST mis à jour le cas échéant, qu'on utiliserait alors à la place de celui du bundle) ça ça dépend de ce qu'Artostizer souhaite faire... mais bon dans un premier temps encapsuler le PLIST dans le projet donc le bundle me semble déjà plus simple surtout s'il débute, ne compliquons pas les choses. Rien ne l'empêchera de mettre le PLIST sur un serveur plus tard s'il veut permettre les Mà J.
Donc oui pour le PLIST
1 - Pour les réponse je les charge donc à partir d'une .plist (ca j'ai piger) avec un NSArray, mais le mieux est que je charge tout ca dans une UITableView ou dans plusieurs UILabel ? parce que tu parle de tirer un chiffre au hasard e de le mémoriser dans un tableau mais je suis un dans le flou là car je ne maitrise pas encore tout à fond.
2 - Ca concerne mon fichier .plist, en fait moi j'avais penser à deux fichiers .plist, un qui renferme les questions avec les réponses (en texte pour les charger soit dans la UITableView, soit dans les UILabel's) et un autre fichier .plist qui elle renferme les solutions aux réponses, mais en voyant ton raisonnement je pense que ta solutions est plus approprier et m'évite d'avoir aussi par la même occasion trop de fichier dans mon projet ;-) !!!
Donc en suivant ton raisonnement, la structure du .plist serait :
(NS)Array (masterQuestions)
|
|
|____ (NS)Dictionnary
| |________________ (NS)Array (flatQuestion1)
| |________________ (NS)Number (answerB)
| |________________ (NS)Array (flatAnswer)
|
|
|____ (NS)Dictionnary
| |________________ (NS)Array (flatQuestion2)
| |________________ (NS)Number (answerC)
| |________________ (NS)Array (flatAnswer)
|
|____ (NS)Dictionnary
| |________________ (NS)Array (flatQuestion3)
| |________________ (NS)Number (answerF)
| |________________ (NS)Array (flatAnswer)
|
|
|____ (NS)Dictionnary
| |________________ (NS)Array (flatQuestion4)
| |________________ (NS)Number (answerB)
| |________________ (NS)Array (flatAnswer)
|
|...etc
Grand merci à toi pour ton aide et pour ce chaleureux accueil !!!
a) Mon PLIST est donc un tableau.
b) Chaque élément de ce tableau est un NSDictionary qui décrit une question dans son ensemble.
c) Ce NSDictionary contient 3 clés / éléments :
1) l'intitulé de la question (NSString) identifié par la clé "question" de ce dictionary,
2) la liste des réponses (NSArray contenant un nombre arbitraire de NSStrings) identifié par la clé "answers" de ce dictionary
3) le numéro correspondant à la bonne réponse (un NSNumber), identifié par la clé "answer" de ce dictionary
Après il te suffit de charger ce PLIST avec [tt]NSArray* tab = [NSArray arrayWithContentsOfFile:...][/tt], et quand tu veux piocher une question bas tu tires un nombre N au hasard entre 0 et [tt][tab count][/tt] pour savoir quelle question choisir de poser.
Tu vas donc pouvoir récupérer le NSDictionary décrivant la question dans son ensemble (b) avec [tt]NSDictionary* q = [tab objectAtIndex:N][/tt]
Et ensuite une fois que tu as ce NSDictionary tu peux en extraire la question (1), le tableau/la liste des réponses (2) et le numéro de la bonne réponse (3), avec [tt][q valueForKey:...][/tt] en fournissant la clé qui va bien pour chacun.
Je suis entrain d'essayer de coder tous ça mais je pense que je vais souvent revenir sur ce post pour poser d'autres questions sur mon code !!! ;-)
J'ai fait ça (en récuperant ton exemple biensur):
Je croyais que ca serait plus simple à mettre en oe“uvre vu que j'avais un exemple de code que je comprenais plus ou moins mais la ... c'est pas gagner !!!
Fais du pas-à -pas avec le débogueur, tu vas bien trouver où ça coince.
Ben la question c'est qu'ai-je mal fait sur ma fonction "loadQuiz" !!!
J'ai des erreur mais je ne comprend ce que j'ai mal fait et surtout mal compris !!!
En fait c'est avec mes connexions outlet que je m'embrouille un epu !!!
Si quelqu'un pouvait me filer un petit exemple de header et de m qui implémenterais la technique d'Aligator ca me permettrais de comprendre en visu le fonctionnement et de l'adapter à mon projet en rajoutant mes divers elements (comme le compteur de temps, compteur de bonne réponses...etc)
Merci à vous par avance ;-)
En général quand on a un gros décalage comme ça sur la droite c'est qu'on a oublié de refermer quelque chose la ligne d'au dessus.
Effectivement il semble manquer un crochet fermant après "reponses" ou plutôt y avoir un crochet ouvrant en trop.
Quand à idx en général c'est un raccourci pour "index" quand on veut lui donner un nom plus rapide à écrire, et effectivement il n'est pas déclaré dans ton code, peut être repris d'un exemple ou il était déclaré auparavant.. Ici tu pourrais utiliser n, s'il n'était dans la portée de ton while{} et donc invisible une fois sorti.
Aussi dans un NSSet on ne peut mettre que des objets or n est un int, tu devrais avoir un "Warning" (un triangle jaune).
Si tu as des Warnings ou des Errors tu ne pourras compiler tant que tu ne les auras pas supprimés (les erreurs, les warnings c'est souvent Boum en exécution à ce stade). Pour ça il faut les lire et les comprendre (ou les recopier dans une recherche Google et corriger une fois compris).
Je vais refaire en tentant de bien implémenter les choses manquantes et en corrigeant ma syntaxe mais je pense que vous aurez de mes nouvelles car étant débutant y a des choses qui rentre vite et d'autre moins !!! ;-)
Donc après ton "Build" tu regardes dans la gouttière si tu vois des ronds rouges (erreur) ou des triangles jaunes (warnings) ils sont sur la ligne où le compilateur a rencontré le souci. Tu cliques dessus et une bande à droite contiendra le texte expliquant l'erreur que tu peux retrouver aussi dans le menu "Build->Build Results".
Si tu ne les comprends pas cherche via Google, tu ne seras probablement pas le premier à qui elles arrivent.
Quand ton code compilera, si tu n'arrives pas à ce que tu veux tu peux aussi mettre des points d'arrêt en mode Debugging et suivre à la trace la valeur de tes variables dans ton code en exécution.
Merci de ton aide, je te rassure je suis pas newbies au point de pas savoir qu'un warning ou qu'une erreur doit être régler avant de builder l'application !!!
Merci quand même je re-up donc au cas ou quelqu'un d'un peu plus aviser passe par là et décide de m'aider un peu .
merci à toi quand même
Tu dis que tu n'es pas newbie à ce point, je ne demande qu'à le croire, mais à lire ton code je ne le vois pas, toutes les erreurs que je t'ai pointé sont de celles qu'on ne voit pas dans un code sans warnings ni erreurs.
Fais comme tu l'entends mais si tu ne fais pas tourner ton programme pour nous dire sur quelles erreurs tu butes on aura beaucoup de difficultés à t'aider, c'est probablement pour ça que tu n'as pas plus de réponses.
Tu t'inquiètes déjà de savoir si la méthode d'Ali ne va pas être trop longue mais tu ne l'as pas encore essayée !
Oui effectivement mais je crois avoir dit que je savait qu'une erreur ou un warning doivent être régler avant de builder, et non pas que je n'en faisait pas ou que je savait comment les régler !!!