2010-11-15 14 views
3

J'ai une vue de table avec de nombreuses sections, le titre de ces sections est juste A-Z et # comme dans l'application du carnet d'adresses iPhone. J'ai implémenté sectionIndexTitlesForTableView pour que le rapide se déplace vers une lettre particulière et retourne simplement un tableau de Lettres A - Z et #. Cela fonctionnerait si ma liste contenait toujours un élément pour chaque lettre de l'alphabet mais ce ne serait pas le cas et cela viderait les titres de l'index de section parce que frapper C dans la liste pourrait aller à D si la 3ième section est D (c'est-à-dire s'il n'y a rien dans la section C).sectionIndexTitlesForTableView s'aligner correctement avec les sections

Je sais que je pourrais retourner le tableau dans sectionIndexTitlesForTableView avec seulement les lettres qui sont des sections mais cela semblerait un peu étrange et pas la même fonctionnalité que l'application livre d'adresse iPhone.

Comment puis-je remédier à cela?

Répondre

3

Fondamentalement, vous devez mettre en œuvre:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 
    return [sections indexOfObject:title]; 
} 

et retour en fonction de l'indice et le titre de quel article il doit être allumé. Où sections est le tableau stockant la liste des sections

6

Je ne vois pas comment la méthode de @ Rudiger fonctionnerait si vous n'aviez que les sections A, C, F, S, T et les titres d'index de section pour A-Z. Une telle situation peut survenir lors de l'utilisation de MPMediaQuery. Pour contourner cela, j'ai implémenté cette méthode comme suit, la vue de table défilera vers la bonne section ou la prochaine si celle que vous cherchez n'existe pas.

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 
{ 
    NSString *sectionTitle = nil; 
    NSComparisonResult result; 
    int i; 

    for(i = 0; i < tableView.numberOfSections; i++) 
    { 
     sectionTitle = [self tableView:tableView titleForHeaderInSection:i]; 
     result = [title compare:sectionTitle]; 

     if(result != NSOrderedDescending) 
      break; 
    } 

    return (MIN (i, (tableView.numberOfSections - 1))); 
} 

MISE À JOUR

Changé la valeur de retour pour corriger la situation décrite par Eric D'Souza.

+2

cela fonctionne très bien, sauf dans le cas où l'utilisateur touche un index au-delà du dernier titre de section (par exemple si l'utilisateur touche l'index Z et le dernier indice de section est Y). Je viens de modifier le retour: "return (MIN (i, (tableView.numberOfSections - 1)));" –

+0

Fonctionne pour moi! Si vous avez # dans le tableau A-Z des indices, vous devriez être en premier, avant A, et pas en dernier, après Z. –

+0

C'est génial. J'ai 5k + enregistrements sur uitableview et fonctionne très bien. Merci! –