Ich habe mir einen alternativen Ansatz für die Behandlung einer Alphabetliste mit einem Buchstaben ohne Verwendung von Abschnitten ausgedacht. Es ähnelt der Antwort von Zaph, aber anstatt einen Wert aus der Rückgabe eines neuen Index zu erhalten (da wir immer einen Abschnitt haben), berechnen wir den Index für die Position des ersten Elements im Array, das mit einem bestimmten Zeichen beginnt, und scrollen dann dazu.
Der Nachteil ist, dass das Array jedes Mal durchsucht werden muss (ist das absolut schrecklich?), Allerdings habe ich im iOS-Simulator oder auf meinem iPhone 4S keine Verzögerung oder langsames Verhalten festgestellt.
- (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;
}
Hinzufügen einer Eigenschaft zum Speichern des zuletzt ausgewählten Index wie
@property (assign, nonatomic) NSInteger previousSearchIndex;
und Speichern dieser Eigenschaft jedes Mal wie:
- (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;
}
und Aktualisieren von scrollToRow
Code wie:
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Mach diese Methode noch besser und mit netter Animation.