2009-08-10 8 views
1

Je travaille sur la conversion d'une vue de table simple à une vue de table en coupe. Je voudrais que les titres de section soient la première lettre pour les éléments de la section.Comment retourner un tableau avec les lettres initiales de tous les objets d'un autre tableau?

C'est ce que j'ai jusqu'à présent dans ma méthode de titleForHeaderInSection:

NSSortDescriptor *sortDescriptor; 
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"Name" 
               ascending:YES] autorelease]; 
NSArray *sortedArray; 
NSMutableArray *commonNameArray = [tableDataSource valueForKey:@"Name"]; 

NSArray *uniquearray; 
uniquearray = [[NSSet setWithArray:commonNameArray] allObjects]; 
sortedArray = [uniquearray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

Ce code supprime les titres en double et trie la liste par ordre alphabétique. Maintenant, j'ai juste besoin de convertir les chaînes dans le tableau pour les premières lettres seulement. Quelle est la meilleure manière de s'occuper de ça?

Répondre

7
NSMutableSet *firstCharacters = [NSMutableSet setWithCapacity:0]; 
for(NSString *string in [tableDataSource valueForKey:@"Name"]) 
    [firstCharacters addObject:[string substringToIndex:1]]; 

NSArray *uniquearray = [[firstCharacters allObjects] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
+0

Merci! C'est un peu plus élégant que la solution que j'ai trouvée ci-dessous. Je viens d'ajouter: \t return [uniquearray objectAtIndex: section]; et cela fonctionne comme un charme. – Jonah

+0

Non seulement élégant - mais aussi beaucoup plus efficace ... Vous ne devriez pas faire cela dans un titleForHeaderInSection: aussi - vous devriez conserver votre uniqueArray comme une variable membre et libéré à dealloc. Vous créez un tableau de tous les noms, une version triée, puis en sélectionnant un élément et en obtenant le premier caractère. Le mien fait un jeu de seulement les premiers caractères, puis une version triée - les deux ont au plus 36 caractères (au lieu de # caractères dans tous les membres pour CommonName) – groundhog

+0

Merci pour les suggestions. J'ai maintenant placé la déclaration d'unique dans la méthode viewDidLoad, puis appelé: \t return [arrayOfInitialLetters objectAtIndex: section]; dans la méthode titleForHeaderInSection. – Jonah

0

Merci pour l'aide. Dans un rare moment d'inspiration je l'ai juste travaillé. Voici ce que j'ai fait. Quelqu'un voit-il quelque chose de mal à le faire de cette façon?

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSSortDescriptor *sortDescriptor; 
    sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"CommonName" 
       ascending:YES] autorelease]; 
    NSArray *sortedArray; 
    NSMutableArray *commonNameArray = [tableDataSource valueForKey:@"CommonName"]; 

    NSArray *uniquearray; 
    uniquearray = [[NSSet setWithArray:commonNameArray] allObjects]; 
    sortedArray = [uniquearray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

    NSString *stringForFirstLetter = [[sortedArray objectAtIndex:section] substringToIndex:1]; 

return stringForFirstLetter;} 
Questions connexes