Вы не упоминаете, как выглядят ваши данные, к каким данным вы их анализируете. Я предполагаю, что «Глобальные данные» означают некоторый NSArray, который доступен для всего приложения.
Вы действительно должны подумать об использовании CoreData, если вы этого не делаете.
Я адаптировал пример кода Apple CoreDataBooks , чтобы он использовал не имя автора для создания разделов, а его первую букву.
добавить эту категорию в книгу до реализации RootViewController:
@interface Book (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName;
@end
@implementation Book (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName {
[self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
NSString *aString = [[self valueForKey:@"author"] uppercaseString];
NSString *stringToReturn = [aString substringToIndex:1];
[self didAccessValueForKey:@"uppercaseFirstLetterOfName"];
if ([stringToReturn integerValue] || [stringToReturn isEqualToString:@"0"] ) {
return @"#";
}
return stringToReturn ;
}
@end
в RootViewController - (NSFetchedResultsController *)fetchedResultsController
getter
изменить
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"author" cacheName:@"Root"];
до
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"uppercaseFirstLetterOfName" cacheName:@"Root"];
изменить в ответ на комментарий
Вы можете использовать NSDirectory, который содержит первую букву в качестве ключа и NSArray со всеми связанными объектами данных в качестве объекта.
numberOfSectionsInTableView:
вернется [[theDirectory allKeys] count]
tableView:titleForHeaderInSection:
возвращает [[theDirectory allKeys] objectAtIndex:section]
. Сортировка здесь не показана.
tableView:numberOfRowsInSection:
возвращает [theDirectory objectForKey:[[theDirectory allKeys] objectAtIndex:section]]
- , а в
tableView:cellForRowAtIndexPath:
вы используете indexPath.section
и indexPath.row
для адресации нужных данных.
Я не проверял это.