Ranger un tableau
wallfred
Membre
Bonjour,
J'ai en gros problème et je n'arrive pas à m'en sortir. Ca fait quelques jours que je suis dessus sans résultat.
Je recupere des données d'un serveur (qui me permettent d'établir un objet Evenement).
J'ai au final, un objet Evenement avec plusieurs caractéristiques (monEvenement.nom, monEvenement.lieu, monEvenement.dateHeure). Sachant que monEvenement.dateHeure peut être au format String ou NSDate.
Je veux récupérer ces évènements puis les afficher dans une table. Ca marche, j'arrive à les afficher, mais pas comme je voudrais.
J'aimerais que l'utilisateur ait une table avec comme cellules, les différents jours des événements (donc le champ monEvenement.dateHeure). Et que lorsque l'on clique sur un jour précis, on a tous les événements associés.
En ce moment j'ai les jours (que je récupère avec monEvenement.dateHeure) dans une table.
Cependant il va me mettre 2 fois la même date dans ma table car il y aura 2 événements ce jour la. Et ça me pose problème.
J'ai essayé de créer un tableau de String en prenant juste les dates, et en évitant les doublons. Mais dans ce cas, je n'arrive pas à récupérer ensuite le contenu de mes événements. Puisque je n'ai plus qu'un simple tableau.
Merci de votre aide.
J'ai en gros problème et je n'arrive pas à m'en sortir. Ca fait quelques jours que je suis dessus sans résultat.
Je recupere des données d'un serveur (qui me permettent d'établir un objet Evenement).
J'ai au final, un objet Evenement avec plusieurs caractéristiques (monEvenement.nom, monEvenement.lieu, monEvenement.dateHeure). Sachant que monEvenement.dateHeure peut être au format String ou NSDate.
Je veux récupérer ces évènements puis les afficher dans une table. Ca marche, j'arrive à les afficher, mais pas comme je voudrais.
J'aimerais que l'utilisateur ait une table avec comme cellules, les différents jours des événements (donc le champ monEvenement.dateHeure). Et que lorsque l'on clique sur un jour précis, on a tous les événements associés.
En ce moment j'ai les jours (que je récupère avec monEvenement.dateHeure) dans une table.
Cependant il va me mettre 2 fois la même date dans ma table car il y aura 2 événements ce jour la. Et ça me pose problème.
J'ai essayé de créer un tableau de String en prenant juste les dates, et en évitant les doublons. Mais dans ce cas, je n'arrive pas à récupérer ensuite le contenu de mes événements. Puisque je n'ai plus qu'un simple tableau.
Merci de votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
- à l'aide du KVC tu récupères en une ligne un NSArray contenant toutes les clés dateHeure de ton tableau événement
- puis tu crées un NSSet à partir de ce NSArray pour qu'il supprime de fait les doublons
- puis tu retransforme en NSSet
Enfin c'est la méthode la plus simple que je vois pour ça.
Voire même ne sortir que les dates sans les heures pour que les évènements le même jour soient groupés même s'ils sont à des heures différentes (là je prévoirais une méthode "date" dans la classe Evenement qui retourne cette date sans l'heure, ça facilitera le tri).
Ensuite tu utilises ce tableau filtré pour afficher tes dates dans ta TableView.
Et quand tu cliques sur une ligne de ta TableView, tu cherches dans ton tableau comlpet d'évènements ceux qui ont cette date.
Autre solution, sans doute plus propre, c'est de transformer ton NSArray d'évènements en un NSDictionary contenant les évènements indexés par leur date. Pour la clé correspondant à une date, tu as un NSArray contenant tous les évènements à cette date.
Solution même plus simple en terme d'intégration, c'est que ce soit ton WebService qui fasse ce travail et te retourne déjà une structure organisée. A voir comment tu as prévu la conception de ton WebService et comment il est utilisé dans les reste de ton appli, etc.
J'ai déjà essayé NSSet ça fonctionne que si je fait auparavant un nouveau tableau sans les heures , mais ça me mélange mes dates.
Et je n'arrive pas à les remettre dans l'ordre.
En plus de ça, je suis bloqué pour afficher les événements qui contiennent la date. Parce que je prends la date, je la coupe pour la mettre dans un nouveaux tableau, puis je supprime les doublons en l'ajoutant encore dans un nouveau tableau.
A la fin je me retrouve avec un tableau de String qui n'a plus aucun lien avec le contenu de mes évènements.
Concernant la méthode des NSdictionnary, j'ai essayé mais je n'arrive pas à associer plusieurs évenement à une date.
Pour la troisième solution, ce serait super lol, mais le serveur n'est pas à moi. Et j'ai aucune possibilité de modifier ça.
Pour le lien avec les événements, suffit de faire une comparaison.
Pour le NSDictionary, suffit d'associer un NSArray d'events
Bref ce n'est que de la manipulation de données. A toi de voir ensuite comment tu veux organiser ton modèle de ton MVC.
En ce moment j'arrive à récupérer mes dates sans doublons dans un tableau (j'ai réussi avec des boucles for, ce n'est pas trés efficace, mais je vais m'orienter vers les NSSet).
Je les affiches dans le titleForHeaderInSection: de ma tableView. Mais j'ai toujours le même soucis, comment je vais associer chaque cellule à la bonne date vu qu'il peut y avoir plusieurs évènements dans une journée.
C'est la que je comprend pas, je vois pas comment a partir d'un tableau de date, je vais réussir à récupérer le bon évènement puis afficher son nom (qui est dans un autre tableau).
En sachant que le lien entre mes 2 tableaux est inexistant (enfin pour moi, et je pense que c'est la que je dois faire fausse route). Mon premier tableau contient mes événements avec les informations et des dates avec l'heure en format String. Mon Second tableau contient ces mêmes dates (sans l'heure) en format string aussi. Peut-ton relier ces 2 tableaux d'une façon ?
Merci
J'ai pour ma part un tableau (corps) qui contient des dictionnaires dont une des clefs est "Code" et la valeur une NSString. J'obtiens les différents "Code" dans l'ordre du tableau avec la ligne
ça marche aussi un peu plus loin avec une NSString "Date"..
ça ne me donne pas les dictionnaires, juste un tableau des différents objets, pour trouver les dictionnaires (jusqu'à maintenant dans l'ordre du tableau aussi) j'utilise un NSPredicate et une boucle sur le tableau des valeurs uniques.
Si ça peut aider ...
Mais je ne vois toujours pas comment procéder.
Mes tableaux sont :
1. Un tableau avec des dates en string sans les heures
2. Un tableau contenant les objets évènements avec les dates, nom, lieu (dates en string mais avec l'heure en plus)
Comment à partir de mon tableau1, je peux ressortir des valeurs du tableau2 à un champ correspondant ?
Quand tu sélectionnes une date dans ton tableau 1, pourquoi ne fais tu pas un filtrage avec les données peuplant ton tableau 2 qui ne te ressortirait que les objets ayant la même date que celle sélectionnée ?
[Edit]
Désolé, j'avais mal lu: si ton tableau evenements a des dates+heure en string tu n'as qu'à faire un substringToIndex:indexFinDate pour en sortir la date sans heure.
// indexFinDate selon le format de tes strings du tableau 1
Puis
[/edit]
Une boucle (for NSString *stringDate in lesChainesTableau1)
{
[tableau2 IndexesOfObjectsPassingTest:^Bloc {return [[[obj date] substringToIndex:indexFinDate] isEqualToString:stringDate]}] //obj est l'élément du tableauEvenements en train de passer le test
}
A la sortie tu as un indexSet que tu utilises avec objectsAtIndexes
hth
Sinon de mon coté, J'ai fait quelques chose qui fonctionne. Mais le problème c'est que mon application rame vraiment beaucoup.
Dans mon avancement, j'ai réussi à ressortir un tableau avec les dates sans doublons, je me sert de ce tableau dans "numberOfRowsInSection:" pour definir une date = une section :
Puis je m'en sert dans "cellForRowAtIndexPath", et je pense que c'est ici que sa rame :
Est-ce que la lenteur est due aux cellules qui à chaque fois exécutent la boucle for?
Ne jamais faire de calculs complexes dans les méthodes cellForRow & numberOfRows ou numberOfSections. Ce sont des méthodes qui sont appellées plein de fois (à chaque fois qu'une cellule doit s'afficher à l'écran, y compris donc à chaque fois que tu scroll ta TableView).
Il faut calculer tes correspondances avant.
D'où l'idée que je t'avais suggéré de construire un NSDictionary, dont les clés sont tes dates (sans les heures), et les valeurs associées à chaque clé sont tes NSArray "tableauDeNom" correspondant. Comme ça à tout moment tu peux récupérer tous les événements associés à une date donnée en demandant au dictionaire la valeur (qui sera un NSArray d'évènements donc) associée à la date.
Dans numberOfSections il suffira de retourner le nombre de clés de ton dictionnaire (nombre de dates)
Dans titleForSection de retourner le nom de la clé donnée
Dans numberOfRowsForSection de retourner le nombre d'éléments du NSArray associé à la date de la section
etc.
Faut que je refasse tout alors.
Mais je vois pas comment le faire avant, vu que justement j'avais "section" qui me permettait de tout delimiter et de bien trier.
Si je rend "section" commun à toute la classe (je le déclare dans le .h), est que je fait exactement les mêmes méthodes dans le viewDidLoad, ça pourrait le faire ? non ?
Ce qui donne
Pour aller (probablement) plus vite dans ta boucle..
A jouter aux améliorations de fond que suggère Ali, car lui utilises iOS pas moi et il vaut mieux que tu apprennes à bien penser tes classes dès le début. amha
C'est à ce moment là (qd tu reçois ton tableau d'Evenements) qu'il faut le restructurer, pour avoir une structure adaptée à ton UITableViewDataSource.
J'ai déjà mon tableau de dates, et un tableau d'evenement. Si j'ai bien compris, je prend la méthode de "laudema" :
Ca permet de récupérer les nom événements à une date particuliere, si 'ai bien compris.
Ensuite, comme dit "Aligator", je rajoute un dictionnaire à la fin, avec comme clé : date, nom (éventuellement lieu par la suite).
C'est bien ça ? Et comment on va pourvoir ajouter deux unEvement.nom à une même date ?
J'ai essayé, et il me renvoi que le dernier nom (efface le premier)
La construction du dictionnaire n'est pourtant pas compliquée...
Soit tabEvents ton NSArray contenant tous tes objets Evenements (par exemple variable locale que tu récupères dans la méthode qui reçoit la réponse à ton WebService quand ce dernier te retourne tous tes événements en vrac) : Avec ça dans la propriété eventsDict (que tu auras pris soin de déclarer dans ton .h en mode retain, cela va de soi) tu auras un dictionnaire indexé par les dates, et pour chaque date tu auras un tableau contenant tous les évènements qui sont à cette date.
A partir de là , maintenant que ce dictionnaire de tableaux d'évènements est construit, cellForRowAtIndexPath et numberOfSections ou numberOfRowsInSection s'écrivent tout seul et ne prennent que quelques lignes.
Bon sauf que là je t'ai mâché le travail et même donné le code tout cru pour construire ce dictionnaire, tu n'as pas réussi à le construire tout seul en suivant les explications et instructions données ici... et du coup si tu n'arrive pas à ça, c'est certainement qu'il y a des bases à revoir avant de s'attaquer à ce genre de truc ? Par exemple si tu n'arrives pas tout seul à coder les méthodes genre numberOfSections à partir de là , abandonne ce projet pour l'instant car si tu bloques là tu vas bloquer à plein d'autres endroits, et repars de bases plus simples sur des projets et programmes d'exemples plus simples.
Oui il faut que j'apprenne mieux les bases.