Вы когда-нибудь решали эту проблему?
Мне удалось добиться правильного отображения индекса заголовка раздела, реализовав sectionIndexTitlesForTableView: создать собственный массив заголовков разделов:
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
NSMutableArray *indexKeys = [NSMutableArray arrayWithCapacity:30];
NSArray *fetchedResults = [fetchedResultsController fetchedObjects];
NSString *currKey = @"DEFAULT";
for (NSManagedObject *managedObject in fetchedResults) {
NSString *indexKey = [managedObject valueForKey:@"indexKey"];
if (![indexKey isEqualToString:currKey]) {
[indexKeys addObject:indexKey];
currKey = indexKey;
}
}
return indexKeys;
}
Здесь indexKey - это первая буква имени.
Однако это создает одну из двух проблем в sectionForSectionIndexTitle: вместо этого:
Если я просто возвращаю индекс для раздела, то это теперь несортированный индекс и больше не соответствует порядку сортировки в fetchResultController:
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return index;
}
В качестве альтернативы, если я передаю вызов fetchedResultsController, он прерывается на заголовки неамериканских индексов, поскольку они больше не являются странными символами, используемыми fetchedResultsController:
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}
Последний код генерирует ошибку следующего вида при переходе к заголовку индекса «Ø»:
Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Заголовок индекса в 24 не равен« Ø »*
Обходной путь для этого состоит в том, чтобы перевести оскорбительных персонажей обратно в их странные "я":
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
if ([title isEqualToString:@"Æ"]) {
title = @"\u2206";
} else if ([title isEqualToString:@"Ø"]) {
title = @"\u0178";
} else if ([title isEqualToString:@"Å"]) {
title = @"\u2248";
}
return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}
Значения Unicode можно найти в отладчике с помощью действия «Печать описания в консоль».
Однако хорошим решением было бы выяснить, почему происходит эта странная кодировка, и предотвратить ее.