TableView et Section

CeetixCeetix Membre
22:37 modifié dans API UIKit #1
Salut !

Voilà  j'ai trouvé une méthode mais elle est un peu lourde et j'aimerai savoir si vous avez un truc plus simple.
En gros j'ai mon TableView qui affiche des noms déjà  classés par ordre alphabétique. J'aimerai qu'à  chaque changement de lettre il y a une petite section grise qui indique la première lettre des mots qu'on s'apprête à  consulter.

Vous voyez?

Au départ j'avais penser faire plusieurs tableaux contenant juste les mots commençant par la même première lettre mais bon c'est archi lourd :s

Réponses

  • AliGatorAliGator Membre, Modérateur
    22:37 modifié #2
    En gros tu veux un look comme l'application Contacts, avec une liste triée alphabétiquement et une nouvelle section à  chaque changement de première lettre ?

    Tu peux utiliser les méthodes filteredArrayUsingPredicate: pour récupérer un tableau ne contenant par exemple que les noms commençant par la lettre A :
    NSArray* allContacts = ...; // un NSArray de NSStrings représentant les noms<br /><br />NSArray* contactsA = [allContacts filteredArrayUsingPredicate:[NSPredicate<br />&nbsp; &nbsp; predicateWithFormat:@&quot;SELF BEGINSWITH &#39;A&#39;&quot;]];<br />// ce nouveau tableau ne contient que les noms commençant par A
    


    Après dans tous les cas vu qu'il est plus efficace d'optimiser les NSArrays pour l'affichage, car "[tt]tableView:cellForRowAtIndexPath:[/tt]" peut être appelé assez souvent, il est de bon aloi d'éviter de faire cette "extraction" de chacun de tes sous-tableaux hors de [tt]tableView:cellForRowAtIndexPath:[/tt] mais de la faire en amont, et de mémoriser ce découpage par exemple dans un NSDictionary de NSArray (les clés du NSDictionary seraient les premières lettres, donc @A, @B, ... et les valeurs associées à  ces clés seraient les NSArray contenant tous les noms commençant par cette lettre).
  • CeetixCeetix Membre
    22:37 modifié #3
    Hum ok donc ça se rapproche de la méthode à  laquelle j'avais pensé. Poua 26 tableaux ^^
    Merci pour la piste !
  • AliGatorAliGator Membre, Modérateur
    22:37 modifié #4
    Pas vraiment 26 tableaux, plutôt un dictionnaire comportant 26 (ou plutôt 27) tableaux (le 27e étant pour tous les noms ne commençant pas par une lettre de l'alphabet, genre commençant par un chiffre ou un caractère spécial, car il faut bien prévoir le coup aussi).
    Avec une petite boucle pour générer ces tableaux puis les mettre dans un NSDictionary selon la première lettre, ça doit pas être bien méchant.

    Et sinon je t'ai proposé la solution des NSPredicate, mais si ton tableau doit être trié alphabétiquement de toute façon, ça peut être plus efficace sinon aussi d'utiliser ce tri pour la séparation. Une solution est simplement de mémoriser les positions des changements de lettre.
    On pourrait ainsi imaginer qqch comme cela :
    NSUInteger offsets[28];<br /><br />NSArray* sortedArray = [allContactsUnsorted sortArrayUsingDescriptors:...];<br />NSUInteger i=0;<br />int currentLetterIndex = 0; // 0 = lettres avant &#39;A&#39;, 1=&#39;A&#39;, 2=&#39;B&#39;, ...26=&#39;Z&#39;, 27=lettres après &#39;Z&#39;<br /><br />for(NSString* name in sortedArray)<br />{<br />&nbsp; unichar firstLetter = [[name uppercaseString] characterAtIndex:0];<br />&nbsp; int firstLetterIndex = (firstLetter&lt;&#39;A&#39;) ? &#39;A&#39;-1 : (firstLetter&gt;&#39;Z&#39;) ? &#39;Z&#39;+1 : (firstLetter-&#39;A&#39;+1));<br /><br />&nbsp; // si on a changé de lettre par rapport au dernier nom, stocker l&#39;index<br />&nbsp; // boucler, car on peut passer de &quot;B&quot; à  &quot;D&quot; s&#39;il n&#39;y a pas de nom commençant par &quot;C&quot; par ex.<br />&nbsp; while(currentLetterIndex != firstLetterIndex) {<br />&nbsp; &nbsp; currentLetterIndex++;<br />&nbsp; &nbsp; offset[currentLetterIndex] = i;<br />&nbsp; }<br />&nbsp; i++; // next name in the array<br />}
    
    Bon j'ai pas testé mais c'est pour montrer le principe. A la fin de ce code, dans le tableau C "offsets" tu auras les offsets des noms pour chaque première lettre. Ainsi, le premier nom commençant par la lettre "D" sera à  la position [tt]offset['D'-'A'+1] = offset[4][/tt] dans ton NSArray.

    Avec ça y'a sans doute moyen de se débrouiller pour remplir la tableView sans trop de mal...
    Enfin c'est qu'une suggestion, à  creuser, ça évite d'avoir 28 tableaux quoi
Connectez-vous ou Inscrivez-vous pour répondre.