Как мне изменить порядок отображения разделов в UITableview, заполненном из NSFetchedResultsControler? - PullRequest
1 голос
/ 27 августа 2010

Мне было интересно, знает ли кто-нибудь лучшее решение для определения пользовательского порядка отображения для разделов в UITableView - я загружаю данные, используя Core Data и NSFetchedResultsControler, и я успешно использую NSSortDescriptors, а также успешно группирую возвращаемые элементы.в разделы, используя sectionNameKeyPath:

Пока все хорошо, НО - разделы перечислены в алфавитном порядке, и я хотел бы переопределить это и упорядочить разделы в определенном пользовательском порядке сортировки.

Например,если бы у меня был объект с именем Item с атрибутом color, и я использовал этот атрибут цвета в качестве sectionNameKeyPath: как бы я тогда упорядочил разделы особым образом - в настоящее время разделы отображаются как

синий, зеленый, индиго, Оранжевый, Красный, Фиолетовый, Желтый.

  • , потому что у них есть NSortDescriptor, примененный к NSFetchedResultsController (который я определил).НО, как я мог бы переупорядочить эти разделы особым образом, чтобы отобразить разделы следующим образом -

Красный, Оранжевый, Желтый, Зеленый, Синий, Индиго, Фиолетовый.

Мой код NSFetchedResultsControllerследует -

- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController_ != nil) {
        return fetchedResultsController_;
    }

    /*
     Set up the fetched results controller.
    */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.

    NSSortDescriptor *colourDescriptor = [[NSSortDescriptor alloc] initWithKey:@"colour" ascending:YES];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:colourDescriptor, sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"colour" cacheName:@"Root"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [colourDescriptor release];
    [sortDescriptors release];

    NSError *error = nil;
    if (![fetchedResultsController_ performFetch:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return fetchedResultsController_;
}

Я понимаю опубликованные примеры использования пользовательского подкласса NSManagedObject и метода получения для динамического назначения свойства, которое будет использоваться в качестве sectionNameKeyPath: но примеры для них по-прежнему, как правило, предоставляют имена разделовкоторые затем перечислены в алфавитном порядке.

Я, конечно, новичок в этом, но любые предложения / указания будут с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 августа 2010

Чтобы обеспечить пользовательский порядок сортировки по разделам, необходимо создать подкласс NSFetchedResultsController.

Из документов NSFetchedResultsController класса:

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

Для реализации получите атрибут section контроллера выбранных результатов, представляющий собой массив имен разделов, отсортированных в алфавитном порядке, а затем верните правильный элемент для индекса раздела таблицы.

0 голосов
/ 10 марта 2017

Вместо хранения строк «Красный», «Оранжевый», «Желтый» и т. Д. Сохраните значения перечисления, представляющие цвета.Поэтому храните 0 для красного и 1 для оранжевого и т. Д. Тогда он будет отсортирован правильно.Когда вы хотите отобразить заголовок раздела, используйте перечисление, чтобы выяснить, какой это цвет, и найдите правильную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...