Ich habe einen alternativen Ansatz gefunden, um eine Alphabetliste mit einem einzigen Buchstaben zu bearbeiten, ohne Abschnitte zu verwenden. Es ist ähnlich wie Zaphs Antwort, aber anstatt einen Wert aus der Rückgabe eines neuen Index zu erhalten (da wir immer 1 Abschnitt haben werden), berechnen wir den Index für die Position des ersten Elements im Array, das mit einem bestimmten Zeichen beginnt, dann blättern Sie zu ihm.
Der Nachteil ist, dass dafür jedes Mal das Array durchsucht werden muss (ist das wirklich so schlimm?), aber ich konnte weder im iOS-Simulator noch auf meinem iPhone 4S eine Verzögerung oder ein langsames Verhalten feststellen.
- (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 gewählten Index wie
@property (assign, nonatomic) NSInteger previousSearchIndex;
und speichern diese 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 die Aktualisierung scrollToRow
Code wie:
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Machen Sie diese Methode noch besser und mit schöner Animation.