Вы должны просто передать "name" как sectionNameKeyPath. См. ответ на вопрос «Базовые данные, поддерживаемые UITableView с индексацией».
UPDATE
Это решение работает только в том случае, если вам нужна только быстрая прокрутка заголовка индекса. В этом случае вы бы НЕ отображали заголовки разделов. Ниже приведен пример кода.
В противном случае, я согласен с refulgentis, что переходное свойство является лучшим решением. Кроме того, при создании NSFetchedResultsController, sectionNameKeyPath имеет следующее ограничение:
Если этот ключевой путь не совпадает с
что указано в первом роде
дескриптор в fetchRequest, они должны
генерировать те же относительные упорядочения.
Например, дескриптор первой сортировки
в fetchRequest может быть указан ключ
для постоянного свойства;
sectionNameKeyPath может указывать ключ
для переходного свойства, полученного из
постоянное свойство.
Реализации UITableViewDataSource в Boilerplate с использованием NSFetchedResultsController:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[fetchedResultsController sections] count];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [fetchedResultsController sectionIndexTitles];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
// Don't implement this since each "name" is its own section:
//- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
// id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
// return [sectionInfo name];
//}
ОБНОВЛЕНИЕ 2
Для нового переходного свойства uppercaseFirstLetterOfName добавьте новый строковый атрибут к соответствующему объекту в модели и установите флажок «переходный».
Есть несколько способов реализации геттера. Если вы генерируете / создаете подклассы, вы можете добавить его в файл реализации (.m) подкласса.
В противном случае вы можете создать категорию в NSManagedObject (я поместил это прямо в начало файла реализации моего контроллера представления, но вы можете разделить его между соответствующим заголовком и собственным файлом реализации):
@interface NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName;
@end
@implementation NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName {
[self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
NSString *aString = [[self valueForKey:@"name"] uppercaseString];
// support UTF-16:
NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];
// OR no UTF-16 support:
//NSString *stringToReturn = [aString substringToIndex:1];
[self didAccessValueForKey:@"uppercaseFirstLetterOfName"];
return stringToReturn;
}
@end
Также, в этой версии не забудьте передать 'uppercaseFirstLetterOfName' в качестве sectionNameKeyPath:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext
sectionNameKeyPath:@"uppercaseFirstLetterOfName" // this key defines the sections
cacheName:@"Root"];
И, чтобы раскомментировать tableView:titleForHeaderInSection:
в реализации UITableViewDataSource:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo name];
}