UITableview avec section

salut tous le monde



j ai un tableau avec des elements chaque element comport une sectionID



et je voudrais classer les elements dans des sections en fonction de leur sectionID





merci
«1

Réponses

  • je ne sais pas je me suis bien expliqué



    mais en gros a faire une condition si sectionID est egal a 0 vas a la section 0 , si sectionID = 1 va à  la section 1;







    merci
  • AliGatorAliGator Membre, Modérateur
    septembre 2012 modifié #3
    Bah heu j'ai envie de te répondre : tu le codes image/tongue.png' class='bbc_emoticon' alt=':P' />
    • Tu te crées un NSDictionary dont les clés seront les sectionID et la valeur associée un NSArray contenant tous les éléments avec ce sectionID.
    • Tu ventiles ton tableau de tous les éléments dans ce NSDictionary (comme ça tu le fais une fois pour toute)
    • Dans ton dataSource de ta tableView, bah... y'a plus qu'à .
      • Nombre de sections = nombre de clés du NSDictionary,
      • nombre de rows dans une section = nombre d'éléments dans l'array associé à  la clé de cette section dans le NSDictionary,
      • élément n°R de la section n°S de la tableView = élément n°R du tableau associé à  la clé S de ton NSDictionary.

  • merci Aligator
    [font=helvetica, arial, sans-serif]Tu ventiles ton tableau de tous les éléments dans ce NSDictionary (comme ça tu le fais une fois pour toute)[/font]
    image/rolleyes.gif' class='bbc_emoticon' alt='::)' />



    ca j ai pas trop suivi (je ne vois pas comment faire );



    merci encore
  • AliGatorAliGator Membre, Modérateur
    Bah heu une boucle sur ton tableau principal contenant tous tes éléments, pour chaque élément tu regardes le sectionID, et tu mets dans le tableau correspondant à  la bonne clé de ton dico.

    Donc si pour la clé sectionID en question tu n'as encore rien dans ton dico, tu crées un NSMutableArray avec l'élément en question et tu l'associé à  la clé sectionID, si tu as déjà  un NSMutableArray associé à  ce sectionID qui est commencé tu rajoutes juste l'élément à  ce tableau existant. Rien de bien sorcier.
  • salut AliGator



    j ai fais mon tableau et je voulais savoir si j étais sur la bonne route
    <br />
    NSMutableArray *mon_tableau = [NSMutableArray arrayWithObjects:[NSArray arrayWithObjects:@&quot;0&quot;,nil], [NSArray arrayWithObjects:@&quot;1&quot;, nil], [NSArray arrayWithObjects:@&quot;2&quot;, nil],[NSArray arrayWithObjects:@&quot;3&quot;, nil],[NSArray arrayWithObjects:@&quot;4&quot;, nil], nil];<br />
    




    j ai un object JSON NSAray donnees



    apres je suis bloqué
  • AliGatorAliGator Membre, Modérateur
    Bon puisque tu ne sembles pas comprendre les explications textuelles, voilà  le code (en gros, pas vérifié, tapé en live).

    Je n'aime pas trop fournir le code directement car pédagogiquement tu n'apprends pas de toi-même comment faire et tu ne fais pas la réflexion pour arriver au résultat, donc au final tu ne sauras pas refaire tout seul, mais bon... Au moins prends le temps de bien décortiquer mon code et comprendre pourquoi j'ai fait ci ou ça et comment ça fonctionne (surtout que j'ai donné les étapes dans les messages précédents tu devrais t'en sortir)
    -(void)buildDispatchDictionaryFromElements:(NSArray*)elementsArray<br />
    {<br />
      NSMutableDictionary* sectionsDict = [NSMutableDictionary dictionary];<br />
      // Je sais pas c&#39;est quoi tes éléments de ton tableau d&#39;origine ? Des NSDictionary ? Une classe perso &quot;Element&quot; ? A toi d&#39;adapter en conséquence<br />
      for(Element* element in elementsArray)<br />
      {<br />
        id sectionIDKey = [NSNumber numberWithInt:lement.sectionID]; // regarder la sectionID de l&#39;élément, qu&#39;on va utiliser comme clé pour le dico<br />
        // Récupérer la liste des éléments qui ont cette sectionID, pour y ajouter notre élément à  cette liste<br />
        NSMutableArray* listOfElementsOfThisSectionID = [sectionsDict objectForKey:sectionIDKey];<br />
        if (&#33;listOfElementsOfThisSectionID)<br />
        {<br />
           // Mais avant, si on n&#39;a encore jamais eu d&#39;élément de cette section, ladite liste n&#39;existe pas, donc préparer le tableau<br />
           listOfElementsOfThisSectionID = [NSMutableArray array];<br />
           // Et le mettre dans le dico puisqu&#39;il n&#39;y était pas encore<br />
           [sectionsDict setObject:listOfElementsOfThisSectionID forKey:sectionIDKey];<br />
        }<br />
        // On peut alors ajouter notre élément au tableau des éléments correspondant à  la clé sectionIDKey<br />
        [listOfElementsOfThisSectionID addObject:element];<br />
      }<br />
    <br />
      self.sections = [NSDictionary dictionaryWithDictionary:sectionsDict];<br />
    }<br />
    <br />
    -(NSInteger)numberOfSectionsForTableView:(UITableView*)tableView<br />
    {<br />
      // Là  il suffit de regarder combien le dictionaire de sections qu&#39;on a construit au préalable a de sections, justement<br />
      return self.sections.allKeys.count;<br />
    }<br />
    <br />
    -(NSInteger)tableView:(UITableView*)tv numberOfRowsInSection:(int)section<br />
    {<br />
      NSArray* listOfAllElementsInSection = [self.sections objectForKey: [NSNumber numberWithInt:section] ];<br />
      return listOfAllElementsInSection.count;<br />
    }<br />
    <br />
    -(UITableViewCell*)tableView:(UITableView*)tv cellForRowAtIndexPath:(NSIndexPath*)indexPath<br />
    {<br />
      // ...<br />
      NSArray* listOfAllElementsInSection = [self.sections objectForKey: [NSNumber numberWithInt:indexPath.section] ];<br />
      Element* element = [listOfAllElementsInSection objectAtIndex:indexPath.row];<br />
      // ... configure ta cell pour afficher les infos de ton élément<br />
    }
    
  • AliGatorAliGator Membre, Modérateur
    septembre 2012 modifié #8
    Pour compléter l'explication par l'exemple : au final, si tu avais les éléments A,B,C,D,E,F,G dans ton tableau, avec A et C ayant un sectionID = 1, G un sectionID = 2, B et D un sectionID = 3 et E,F un sectionID = 4, cela va te construire le dictionaire "sections" suivant :


    {<br />
      1 =&gt; [A, C]<br />
      2 =&gt; [G]<br />
      3 =&gt; [B, D]<br />
      4 =&gt; [E, F]<br />
    }
    
    Note que pour que le code marche il suppose que si tu as N sectionID différents utilisées par les éléments de ton tableau d'origine, ces N sectionIDs vont de 0 à  N-1, puisqu'on utilise directement le indexPath.section comme valeur du sectionID dans le UITableView. Si ce n'est pas le cas, il faut utiliser un tableau intermédiaire, qui sera simplement la liste des sectionID triés par ordre croissant ([self.sections.allKeys sortedArrayUsingSelector:@selector(compare:)]). Pour la section S de la tableView, tu iras chercher non pas les éléments de la sectionID n°S, mais les éléments de la sectionID dont la valeur est le S-ième élément de ton tableau trié. Comme ça si tu as comme sectionID 1,3,5,6, la section 0 de ta UITableView affichera les éléments de sectionID 1, la section 1 de la TV affichera les éléments de sectionID 3, etc.
  • montgomerymontgomery Membre
    septembre 2012 modifié #9
    merci Aligator pour tes explications


    self.sections = [NSDictionary dictionaryWithDictionary:sectionsDict];




    tu ne comprend pas cette ligne car tu utilises sections alors qu' il est declaré nul part .



    je cherche a comprendre les chose avant d' utilisé ton code alors merci encore .



    montgomery
  • tu utilises une classe Element sauf que moi j ai tableau je j appel (infos).
  • AliGatorAliGator Membre, Modérateur
    Oui il faut déclarer une "@property(retain) NSDictionary* sections" dans ton @interface (et faire le @synthesize dans ton @implementation, et releaser sa variable d'instance associée dans le dealloc, enfin comme d'hab quand tu fais une @property(retain) quoi), qui va servir à  garder de côté ce dictionaire de sections qu'on a construit, et pouvoir le réutiliser dans les autres méthodes de UITableViewDataSource sans avoir à  le recalculer à  chaque fois.
  • AliGatorAliGator Membre, Modérateur
    'montgomery' a écrit:


    tu utilises une classe Element sauf que moi j ai tableau je j appel (infos).
    D'où mon commentaire dans le code :
    // Je sais pas c&#39;est quoi tes éléments de ton tableau d&#39;origine ? Des NSDictionary ? Une classe perso &quot;Element&quot; ? A toi d&#39;adapter en conséquence
    


    Je peux pas deviner les données que tu manipules (j'ai oublié ma boule de crystal dans mon autre pantalon).

    Donc c'est bien sûr à  toi d'adapter le code à  tes besoins en fonction de tes données etc !
  • merci pour les explications encore



    je vais continuer de tester ton code pour comprendre


    <br />
    (j&#39;ai oublié ma boule de crystal dans mon autre pantalon).<br />
    
    image/implore.gif' class='bbc_emoticon' alt=' o:) ' /> image/rolleyes.gif' class='bbc_emoticon' alt='::)' />



    merci encore
  • salut AliGator



    je reviens pour avec mon code avec zero erors ni de warning mais ca ne marche pas .


    <br />
    - (void)viewDidLoad<br />
    { <br />
      NSMutableDictionary* sectionsDict = [NSMutableDictionary dictionary];<br />
        for(NSDictionary *movie in self.movies)<br />
        {<br />
    	    id sectionIDKey = [movie objectForKey:@&quot;categorie&quot;];<br />
    	   <br />
    	  <br />
    	   <br />
    	    NSMutableArray* listOfElementsOfThisSectionID = [sectionsDict objectForKey:sectionIDKey];<br />
    	    if (&#33;listOfElementsOfThisSectionID)<br />
    	    {<br />
    		  <br />
    		    listOfElementsOfThisSectionID = [NSMutableArray array];<br />
    		  <br />
    		    [sectionsDict setObject:listOfElementsOfThisSectionID forKey:sectionIDKey];<br />
    	    }<br />
    	 <br />
    	    [listOfElementsOfThisSectionID addObject:movie];<br />
        }<br />
       <br />
        self.sections = [NSDictionary dictionaryWithDictionary:sectionsDict];<br />
    }<br />
    -(NSInteger)numberOfSectionsForTableView:(UITableView*)tableView<br />
    {<br />
    return self.sections.allKeys.count;<br />
    }<br />
    <br />
    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(int)section<br />
    {<br />
        NSArray* listOfAllElementsInSection = [self.sections objectForKey: [NSNumber numberWithInt:section] ];<br />
        return listOfAllElementsInSection.count;<br />
    }<br />
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath<br />
    {<br />
      <br />
      NSArray* listOfAllElementsInSection = [self.sections objectForKey: [NSNumber numberWithInt:indexPath.section] ];<br />
    <br />
    <br />
        static NSString *CellIdentifier = @&quot;MunicipalCell&quot;;<br />
       <br />
        MunicipalCell *cell = (MunicipalCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];<br />
        if (cell == nil) {<br />
    	   <br />
    	    NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@&quot;MunicipalCell&quot; owner:self options:nil];<br />
    	   <br />
    	    for (id oneObject in xib) {<br />
    		   <br />
    		    if ([oneObject isKindOfClass:[MunicipalCell class]]) {<br />
    			    cell = (MunicipalCell *)oneObject;<br />
    		    }<br />
    	    }<br />
        }<br />
       <br />
     <br />
       <br />
        NSDictionary *movie = [listOfAllElementsInSection objectAtIndex:indexPath.row];<br />
       <br />
        cell.contentView.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@&quot;eluBg.png&quot;]];<br />
        cell.nom.text = [movie objectForKey:@&quot;nom&quot;];<br />
        cell.foncion.text = [movie objectForKey:@&quot;fonction&quot;];<br />
        cell.selectionStyle = UITableViewCellSelectionStyleNone;<br />
       <br />
        NSURL *url = [[NSURL alloc] initWithString:[movie objectForKey:@&quot;url_image&quot;]];<br />
        [cell.Image setImageWithURL:url placeholderImage:[UIImage imageNamed:@&quot;placeholder&quot;]];<br />
       <br />
        return cell;<br />
    }<br />
    




    je rate un truc mais je ne vois pas quoi exactement



    merci encore
  • AliGatorAliGator Membre, Modérateur
    septembre 2012 modifié #15
    'montgomery' a écrit:


    ca ne marche pas .
    J'ai toujours pas retrouvé ma boule de crystal, désolé.



    Ca veut dire quoi "ça marche pas" ?

    T'as essayé de débuguer un peu, de mettre des breakpoints, de voir les valeurs de tes variables au fur et à  mesure que tu avances dans les lignes de ton programme, de vérifier que tu as bien ce que tu attends ? Je peux pas deviner tout seul ce que tu as dans tes variables ou la tronche de tes objets modèle moi !
  • voila le strutures de mon tableaux

    j ai fais un NSLog de movies


    <br />
    	    {<br />
    	    categorie = 1;<br />
    	    fonction = footballeur;<br />
    	    id = 46;<br />
    	    nom = &quot;toto&quot;;<br />
    	    &quot;url_image&quot; = &quot;http://monimage.com/a050920a67f17c0c4b3f7bbac9ee9d00.jpg&quot;;<br />
        },<br />
    	    {<br />
    	    categorie = 2;<br />
    	    fonction = DD;<br />
    	    id = 47;<br />
    	    nom = &quot;titi&quot;;<br />
    	    &quot;url_image&quot; = &quot;http://monimage.com/cc65f44d1fcf4900755deec47dcf9d4e.jpg&quot;;<br />
        },<br />
    	    {<br />
    	    categorie = 4;<br />
    	    fonction = &quot;voleur&quot;;<br />
    	    id = 48;<br />
    	    nom = &quot;tata&quot;;<br />
    	    &quot;url_image&quot; = &quot;http://monimage.com/8edf5ac3eb1cdb93005783bdc6436bdd.jpg&quot;;<br />
        }<br />
    




    et en faite j ai que des cellules vide



    pour mes titre ce section :


    <br />
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {<br />
       <br />
       <br />
        switch (section) {<br />
    	    case 0:<br />
    		    return @&quot;section1&quot;;<br />
    		    break;<br />
    		   <br />
    	    case 1:<br />
    		    return @&quot;section2&quot;;<br />
    		    break;<br />
    		   <br />
    	    case 2:<br />
    		    return @&quot;section3&quot;;<br />
    		    break;<br />
    		   <br />
    	    case 3:<br />
    		    return @&quot;section4&quot;;<br />
    		    break;<br />
    		   <br />
    	    case 4:<br />
    		    return @&quot;section5&quot;;<br />
    		    break;<br />
    		   <br />
    	    default:<br />
    		    break;<br />
        }<br />
        return nil;<br />
    }<br />
    




    merci
  • AliGatorAliGator Membre, Modérateur
    Bah heu tu as fait du pas à  pas, mis des breakpoints, vérifié que le tableau se remplissait, etc ?

    Comment ça se passe quand tu fais du pas à  pas dans ta boucle ?

    Met des breakpoint, regarde les valeurs de tes variables dans le débuggeur voir si elles ont bien les valeurs attendues au fur et à  mesure que tu avances ton debug pas-à -pas, vérifier qu'il n'y a pas des variables qui sont nil au lieu de récupérer la valeur attendue, je sais pas moi, en un mot, met des breakpoints et débug un peu !
  • ok merci encore
  • bon j ai fais pas à  pas je crois que le souci vien de la boucle .

    j ai fais un NSLog de sections et j ai un tableau vide


    <br />
        self.sections = [NSDictionary dictionaryWithDictionary:sectionsDict];<br />
     <br />
        NSLog(@&quot; les sections %@&quot;,sections);<br />
    




    le resultats
    <br />
    les sections {<br />
    }<br />
    
  • AliGatorAliGator Membre, Modérateur
    Et ? Que se passe-t-il dans la boucle ? Quelle est la valeur de sectionIDKey à  chaque itération ? Est-ce que les itérations passent bien dans le "if" la première fois ?

    Tu es vraiment avare de détails, dis moi.
  • je sais que ce n'est pas simple de prendre le temp d aider un novice comme moi donc merci encore et encore .



    mais oui je suis incapable de faire quelque choses sans savoir pour je le fais et comment ca fonctionne .



    j ai ajouter un NSLog dans la boucle mais ils ne s affichent pas dans la console

    donc je pense que je rentre pas dans la boucle .


    <br />
    	    id sectionIDKey = [movie objectForKey:@&quot;categorie&quot;];<br />
    	   <br />
    	    NSLog(@&quot;%@&quot;,sectionIDKey);<br />
    	   <br />
    	    NSMutableArray* listOfElementsOfThisSectionID = [sectionsDict objectForKey:sectionIDKey];<br />
    	    NSLog(@&quot;%@&quot;, listOfElementsOfThisSectionID);<br />
    




    merci encore
  • AliGatorAliGator Membre, Modérateur
    Heu je crois comprendre à  ta réponse que tu ne fais qu'utiliser les NSLog depuis tout à  l'heure, sans utilise le débuguer et les breakpoints pour pouvoir faire du pas à  pas...



    Utilise les breakpoints pour que l'exécution se mette en pause sur une ligne qui t'intéresse, et utilise le débuguer et fais du pas à  pas pour que le débuggeur exécute une ligne de code à  la fois. Comme ça tu verras si quand tu demandes d'exécuter la ligne suivante après le "for" il rentre dans le for il s'il va directement après le for, etc. Sinon tu t'en sortiras jamais avec juste des NSLog. Et puis le débugueur et les points d'arrêt sont faits pour ça, de toute façon.
  • c'est encore moi



    j ai utilié [font=helvetica, arial, sans-serif] les breakpoints et ça comme erreur je ne rentre pas dans la boucle [/font][font=helvetica, arial, sans-serif]
    [/size][/font][/color]<br />
    [color=#282828][font=helvetica, arial, sans-serif][size=3]movie NSDictionary * 0x01388558 &lt;not an objective-c object&gt;<br />
    
    [/font]





    [font=helvetica, arial, sans-serif]merci encore [/font]
  • 'montgomery' a écrit:


    c'est encore moi



    j ai utilié [font=helvetica, arial, sans-serif] les breakpoints et ça comme erreur je ne rentre pas dans la boucle [/font][font=helvetica, arial, sans-serif]
    [/size][/font][/color]<br />
    [color=#282828][font=helvetica, arial, sans-serif][size=3]movie NSDictionary * 0x01388558 &lt;not an objective-c object&gt;<br />
    
    [/font]





    [font=helvetica, arial, sans-serif]merci encore [/font]




    Bonjour,



    Je viens de lire ce fil et j'ai une petite question, montgomery :

    Est-ce que tu relis tes messages avant de les poster ?

    Car comme te l'a dit Aligator tu es très avare de détails et en plus il faut faire des efforts pour comprendre ce que tu écris.

    Aligator est toujours près à  rendre service mais là  il me semble que tu ne lui facilites pas la tâche...
  • salut EricP





    tu as raison je demande des efforts aux gens sans en faire moi meme donc

    je suis désolé pour les fautes de frappes et d'ortographe



    mais comme j'essayais d'expliquer plus haut je ne rentre pas dans la boucle .

    j'ai installé des breakpoints au debut,au milieu et a la fin de la boucle et il saute la boucle .

    je passe du debut de la boucle a la fin de la boucle .









    merci encore
  • Et bien met un breakpoint avant la boucle et regarde pourquoi l'exécution ne rentre pas dedans.

    Probablement car ton self.movies est vide.
  • montgomerymontgomery Membre
    septembre 2012 modifié #27
    salut Eric P



    apres avoir chercher le problème je crois l' avoir trouvé



    comme tu me disais plus haut mon self.movies est vide !

    je le recupere avec AFNetworking (ces des blocks);


    <br />
    	self.movies = [[NSArray alloc] init];<br />
      <br />
    	NSURL *url = [[NSURL alloc] initWithString:@&quot;http://montgomery.com/json/magazine.php?&amp;json_output&quot;];<br />
    	NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];<br />
      <br />
    	AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {<br />
    		self.movies = JSON ;<br />
    		[self.tableView setHidden:NO];<br />
    		[self.tableView reloadData];<br />
    		[self.activityIndicatorView stopAnimating];<br />
    		NSLog(@&quot;%@&quot; ,self.movies); // tableau rempli<br />
    	  <br />
    	} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {<br />
    		NSLog(@&quot;Request Failed with Error: %@, %@&quot;, error, error.userInfo);<br />
    	}];<br />
      <br />
    	[operation start];<br />
    NSLog(@&quot;%@&quot; ,self.movies); // tableau vide<br />
    




    quand je met ma boucle dans le block success tous fonctionne mais dans le data source je ne recupere plus sections



    voila ou j en suis



    merci a toi et aussi à  AliGator pour votre aide
  • 'montgomery' a écrit:


    quand je met ma boucle dans le black




    Ca doit piquer un peu. image/crazy.gif' class='bbc_emoticon' alt=' B) ' />
  • montgomerymontgomery Membre
    septembre 2012 modifié #29
    c'est dans le block success Mr Kubernan



    et j avoue que ma tête chauffe un peu



    mais merci pour ta contribution image/thumbsup.gif' class='bbc_emoticon' alt='' />
  • salut Aligator



    je n'arrive plus à  avancer car je n 'arrive pas a récuperer mon tableau dans la fonction que tu m'a donné ni dans la fonction viewDidLoad .



    mais quant je suis dans les fonctions data sources le tableau et bien remplie de mes elements .



    si tu as une explication a mon nouveau problème parceque la je craque un peu image/crybaby.gif' class='bbc_emoticon' alt=' :'( ' />



    merci encore
  • Montre-nous ton code montgomery parce que sans c'est difficile !
Connectez-vous ou Inscrivez-vous pour répondre.