Ответ 1
Вы должны просто передать "имя" как sectionNameKeyPath. См. Этот ответ на вопрос "Основные данные, поддерживаемые UITableView с индексированием".
UPDATE
Это решение работает только в том случае, если вам просто нужно иметь быстрый скроллер заголовка индекса. В этом случае вы не будете отображать заголовки разделов. См. Ниже пример кода.
В противном случае я согласен с refulgentis, что переходное свойство является лучшим решением. Кроме того, при создании NSFetchedResultsController sectionNameKeyPath имеет это ограничение:
Если этот путь ключа не такой, как который указан в первом виде дескриптора в fetchRequest, они должны генерируют одинаковые относительные порядки. Например, первый дескриптор сортировки в fetchRequest может указывать ключ для постоянного свойства; sectionNameKeyPath может указывать ключ для переходного свойства, полученного из постоянное свойство.
Boilerplate UITableViewDataSource с использованием 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" переходного процесса добавьте новый атрибут строки к применимому объекту в модели и проверьте поле "переходный".
Существует несколько способов реализации getter. Если вы создаете/создаете подклассы, вы можете добавить его в файл реализации подкласса (.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];
}