2010-05-03 4 views
1

Dans l'annuaire téléphonique natif de l'iPhone - il y a un caractère de recherche dans le haut & # caractère en bas.Ajout de # & signe de recherche à TableIndex dans UITableView

Je veux ajouter les deux de ce caractère dans mon index de table.

Actuellement j'ai implémenté le code suivant.

atoz=[[NSMutableArray alloc] init]; 

    for(int i=0;i<26;i++){ 
     [atoz addObject:[NSString stringWithFormat:@"%c",i+65]]; 
    } 


- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{ 
    return atoz; 
} 

Comment avez # caractère & symbole de recherche dans mon UITableView?

Répondre

5

La meilleure façon d'y remédier est de faire usage des outils fournis par le framework. Dans ce cas, vous souhaitez utiliser UILocalizedIndexedCollation (lien développeur).

J'ai également un décorateur pour cette classe qui est conçu pour insérer l'icône {{search}} pour vous et gérer les décalages. Il s'agit d'un remplacement direct à l'identique pour UILocalizedIndexedCollation. J'ai publié une description plus détaillée de l'utilisation de ce on my blog. Le décorateur est disponible here (Gist).

L'idée de base est de regrouper votre collection dans un tableau de tableaux, chaque tableau représentant une section. Vous pouvez utiliser UILocalizedIndexedCollation (ou mon remplaçant) pour ce faire. Voici une petite méthode de catégorie NSArray j'utilise pour ce faire:

@implementation NSArray (Indexing) 

- (NSArray *)indexUsingCollation:(UILocalizedIndexedCollation *)collation withSelector:(SEL)selector; 
{ 
    NSMutableArray *indexedCollection; 

    NSInteger index, sectionTitlesCount = [[collation sectionTitles] count]; 
    indexedCollection = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount]; 

    for (index = 0; index < sectionTitlesCount; index++) { 
     NSMutableArray *array = [[NSMutableArray alloc] init]; 
     [indexedCollection addObject:array]; 
     [array release]; 
    } 

    // Segregate the data into the appropriate section 
    for (id object in self) { 
     NSInteger sectionNumber = [collation sectionForObject:object collationStringSelector:selector]; 
     [[indexedCollection objectAtIndex:sectionNumber] addObject:object]; 
    } 

    // Now that all the data's in place, each section array needs to be sorted. 
    for (index = 0; index < sectionTitlesCount; index++) { 
     NSMutableArray *arrayForSection = [indexedCollection objectAtIndex:index]; 

     NSArray *sortedArray = [collation sortedArrayFromArray:arrayForSection collationStringSelector:selector]; 
     [indexedCollection replaceObjectAtIndex:index withObject:sortedArray]; 
    } 
    NSArray *immutableCollection = [indexedCollection copy]; 
    [indexedCollection release]; 

    return [immutableCollection autorelease]; 
} 

@end 

Ainsi, étant donné un tableau d'objets, par exemple books que je veux diviser en sections en fonction de leur nom (la classe Book a une méthode name) , Je voudrais faire ceci:

NSArray *books = [self getBooks]; // etc... 
UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation]; 
NSArray *indexedBooks = [books indexUsingCollation:collation withSelector:@selector(name)]; 
+0

Je viens de me rendre compte que le nom de cette méthode de catégorie pourrait être amélioré; Étant donné que le nom implique qu'il modifie le récepteur plutôt qu'un nouveau tableau, un meilleur nom serait probablement indexedArrayUsingCollation: withSelector :. Je salue également toute amélioration à la catégorie ci-dessus. Je suis sûr que ça pourrait être plus efficace. –

Questions connexes