Вы создаете подкласс этого класса, если хотите настроить создание разделов и заголовков индекса. Вы переопределяете sectionIndexTitleForSectionName: если вы хотите, чтобы заголовок индекса раздела отличался от заглавной первой буквы имени раздела. Вы переопределяете sectionIndexTitles, если хотите, чтобы заголовки индексов отличались от массива, созданного путем вызова sectionIndexTitleForSectionName: во всех известных разделах.

тоящее время я работаю над приложением, которое имеет несколько сущностей и отношений, как показано ниже:

Предмет << ->категория.

Я сейчас везуПредмет экземпляры и отображение их в разделах с помощью элементаcategory.name, В этом случае я могу использовать дескриптор сортировки для сортировки категорий по имени, что довольно просто и работает нормально (соответствующий код ниже):

-(NSFetchedResultsController*)fetchedResultsController {
    if (fetchedResultsController_ != nil)
        return fetchedResultsController_;
    NSManagedObjectContext *moc = [order_ managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:moc];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [sortDescriptors release];
    [sortDescriptor release];
    NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
                                          initWithFetchRequest:fetchRequest
                                          managedObjectContext:moc
                                          sectionNameKeyPath:@"category.name"
                                          cacheName:nil];
    controller.delegate = self;
    self.fetchedResultsController = controller;
    [controller release];
    [fetchRequest release];

    NSError *error = nil;
    if (![fetchedResultsController_ performFetch:&error]) {
        // Error handling
    }
    return fetchedResultsController_;
}

Моя проблема сейчас в том, что мне нужно отсортировать эти категории не по имени, а по(NSNumber*) displayOrder атрибут, который является частьюкатегория организация.НО Мне нужно, чтобы заголовки разделов в табличном виде продолжали использовать категориюname.

Если я установлю sortDescriptor для использованияcategory.displayOrder и оставьте sectionNameKeyPath какcategory.nameзаголовки разделов работают нормально, но sortDescriptor просто игнорируется fetchedResultsController, а разделы таблицы упорядочиваются по имени категории (не знаю, почему ??).

Моей следующей идеей было переписатьdisplayOrder метод getter, но это не слишком сильно меня задело, так как типы возвращаемых данных разные, плюс мне нужно было фактическое значение displayOrder для сортировки разделов.

Итак, сейчас у меня есть решение, которое кажется немного неуклюжим (код ниже), и мне интересно, есть ли лучший способ добиться того же, используя только fetchedResultsController.

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
// The code below grabs a reference to first object for a given section
// and uses it to return the associated category name
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    NSArray *menuItems = [sectionInfo objects];
    if ([menuItems count] > 0)
    {
        MenuItem *menuItem = [menuItems objectAtIndex:0];
        NSString *categoryName = menuItem.category.name;
        return categoryName;
    }
    return [sectionInfo name];
}

Я что-то упустил здесь?

Заранее спасибо за ваши мысли.

Рог

Ответы на вопрос(1)

Ваш ответ на вопрос