Я предложил альтернативный подход к обработке однобуквенного алфавитного списка без использования разделов. Это похоже на ответ Zaph, но вместо получения какого-либо значения от возврата нового индекса (так как у нас всегда будет 1 раздел), мы вычисляем индекс для местоположения первого элемента в массиве, который начинается с определенного символа, затем прокручиваем к этому.
Недостатком является то, что каждый раз требуется поискать массив (это абсолютно ужасно?), Однако я не заметил каких-либо задержек или медленного поведения в симуляторе iOS или на моем 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;
}
добавление свойства для хранения последнего выбранного индекса, например
@property (assign, nonatomic) NSInteger previousSearchIndex;
и сохраняем это свойство каждый раз как:
- (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;
}
и обновление scrollToRow
кода, например:
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Сделайте этот метод еще лучше и с хорошей анимацией.