J'ai trouvé une autre approche pour gérer une liste alphabétique d'une seule lettre sans utiliser de sections. C'est similaire à la réponse de Zaph, mais au lieu d'obtenir une valeur en retournant un nouvel index (puisque nous aurons toujours une section), nous calculons l'index pour l'emplacement du premier élément du tableau qui commence par un certain caractère, puis nous le faisons défiler.
L'inconvénient est que cela nécessite de rechercher le tableau à chaque fois (n'est-ce pas absolument terrible ?), mais je n'ai pas remarqué de décalage ou de lenteur dans le simulateur iOS ou sur mon iPhone 4S.
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return[NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
NSInteger newRow = [self indexForFirstChar:title inArray:self.yourStringArray];
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
return index;
}
// Return the index for the location of the first item in an array that begins with a certain character
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
NSUInteger count = 0;
for (NSString *str in array) {
if ([str hasPrefix:character]) {
return count;
}
count++;
}
return 0;
}
ajouter une propriété pour stocker le dernier index sélectionné comme
@property (assign, nonatomic) NSInteger previousSearchIndex;
et en stockant cette propriété à chaque fois comme :
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
NSUInteger count = 0;
for (NSString *str in array) {
if ([str hasPrefix:character]) {
self.previousSearchIndex = count;
return count;
}
count++;
}
return self.previousSearchIndex;
}
et la mise à jour scrollToRow
comme un code :
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Faites cette méthode encore mieux et avec une belle animation.