2013-06-15 3 views
1

Je souhaite répliquer le comportement de la barre de défilement de Contacts.app.UITableView indexé, comme Contacts.app

Je sais que vous devez mettre en œuvre ces deux méthodes:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; 
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index; 

Et que ce que je l'ai fait: le premier renvoie un tableau de caractères A à Z, et le second renvoie l'index. Jusqu'à présent, ça marche plutôt bien: j'ai la barre de défilement, et le défilement fait défiler le fichier UITableView.

Mais j'ai deux questions:

En premier lieu, le problème est, si je n'ai pas de contacts pour la lettre C par exemple, le défilement sera évidemment décalés, et le défilement sur C affiche le D index, en faisant défiler sur D montrera l'index E ... Je pensais à la recherche de la section la plus proche, mais est-ce la façon la plus efficace de le faire? Quelque chose comme la mise en œuvre de cette fonction dans ma classe:

- (NSInteger) getSectionIndexForSectionTitle:(NSString *section) { 
    if ([_allSections objectForKey:section] == nil) { 
     NSComparisonResult res = NSOrderedAscending; 
     for (NSString* sectionTitle in _allSections) { 
      NSComparisonResult tmp = [sectionTitle compare:section]; 
      if (tmp == NSOrderedDescending && res == NSOrderedAscending) 
       return [(NSNumber *)[_allSections objectForKey:sectionTitle] intValue]; 
      res = tmp; 
     } 
     return [_allSections count] - 1; 
    } 
    return [(NSNumber *)[_allSections objectForKey:section] intValue]; 
} 

Mais j'ai peur des mauvaises performances que ces solutions pourraient fournir.

Deuxième question, qui pourrait être liée au premier: Dans Contacts.app, vous ne pouvez pas voir la lettre "O" dans la barre de défilement, mais vous pouvez toujours faire défiler jusqu'à cette section. Une idée sur la façon d'y parvenir?

Merci de me lire et de m'aider!

Répondre

2

Pour obtenir à la fois votre problème, je pense qu'il ya une solution de rechange pour ce .. Essayez de changer le heightForHeaderInSection pour cacher l'en-tête de section qui font section vide pour être cacher alors quand défilement pour que l'indice de la section, il sera affiché le plus proche section.

Et vous gardez le titre de toute la section dans le tableau qui revient de sectionIndexTitlesForTableView, puis l'utilisateur peut faire défiler jusqu'à cette position.

Implémentez donc heightForHeaderInSection pour masquer la section qui n'a pas de ligne, et dans votre sectionIndexTitlesForTableView, sectionForSectionIndexTitle retournera simplement ce que vous avez et n'essayera pas de manipuler l'index.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 
{ 
    NSInteger nRowCount = [[_arrSectionCounts objectAtIndex:section] integerValue]; 
    if (nRowCount == 0) { 
     return 0.0f; 
    } 

    return 22.0f; 
} 
+0

Merci pour votre réponse. Cela semble plus efficace, évidemment. Mais je ne vois pas comment cela résout l'autre question (la lettre "O" n'étant pas présente dans la barre de défilement)? J'ai essayé d'ajouter une section avec une chaîne vide dans '- (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView;', mais si je fais cela, je vais avoir un espace vide dans la barre de défilement, ce que je ne veux pas . – DCMaxxx

3

Vous n'avez pas besoin de hacher les hauteurs des en-têtes de section. Il y a une classe conçue exactement pour le but que vous recherchez: UILocalizedIndexedCollation. Et il y a un grand écrit sur using it to get index scrolling in a table view.

+0

Semble intéressant; y jetterai un coup d'oeil! Merci pour le lien. – DCMaxxx

Questions connexes