Как реализовать разделы с NSFetchedResultsController

Я прочитал несколько похожих проблем и сайтов, и я просто не могу понять этого.

У меня есть NSFetchedResultsController, который отображает информацию от пользователя, добавляющего информацию в ModalViewController с текстовыми полями. Пользователю предоставляется ModalView, и он вводит несколько слов в поля, нажимает «Сохранить», и это составляет единую секционную строку таблиц в TableView, которая реализует протокол NSFetchedResultsController.

Что я хотел бы сделать сейчас:

  • В одном из текстовых полей можно создать новый раздел из информации, предоставленной в этом текстовом поле.

Мой запрос на выборку:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController; 

Атрибут, который я хочу отобразить, — это event.date, что означает, что это отношение между сущностью «Транзакция» и сущностью «Событие» (событие), а createdDate — это атрибут сущности «Событие».

Я вижу, что sectionNameKeyPath:nil нуждается в обновлении, но на что мне его обновить, а также нужно ли мне менять какие-либо методы источника данных, заголовки и т. д.?

Любая помощь в этом будет принята с благодарностью.

Спасибо,


person amitsbajaj    schedule 21.10.2013    source источник


Ответы (1)


Точный ответ зависит от того, что должно отображаться в качестве заголовков разделов и как разделы должны быть отсортированы.

Но обычно вам нужно добавить свойство к объекту, которое затем используется как параметр sectionNameKeyPath. Кроме того, вы должны добавить дескриптор первой сортировки, используя тот же ключ (это условие можно немного смягчить).

Например, если вы просто добавите строковый атрибут sectionName к объекту и используете его как sectionNameKeyPath и как первый ключ дескриптора сортировки, то все объекты с одинаковым значением sectionName будут сгруппированы в один раздел, а разделы будут отсортированы по sectionName. Остальные дескрипторы сортировки используются для сортировки объектов в каждом разделе.

Другим примером может быть определение отдельной сущности «Раздел» со строковым атрибутом «заголовок» и целочисленным атрибутом «индекс», добавление отношения «к одному» «раздел» из «Транзакция» в «Раздел» и использование section.index как sectionNameKeyPath . Опять же, все объекты с одним и тем же разделом группируются вместе, но теперь разделы сортируются по значению section.index, и вы можете изменить tableView:titleForHeaderInSection:, чтобы заголовок отображался в заголовке раздела вместо < em>индекс.

Это довольно общее, но я надеюсь, что это поможет вам начать.

person Martin R    schedule 21.10.2013
comment
Спасибо за вашу помощь, Мартин, это имеет смысл, просто реализация немного сложнее.. Просто в качестве пробы я установил свой атрибут имени как sectionNameKeyPath.. так что это @whoBy.name, где whoBy - это отношение из транзакции к объекту Person, вызывающему атрибут имени. Затем у меня есть следующее в качестве titleForHeaderInSection: - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section { return [[[self.fetchedResultsController section] objectAtIndex:section ] имя]; } Я получаю только один раздел с одной строкой. У вас есть какие-нибудь мысли? - person amitsbajaj; 22.10.2013
comment
должен ли sectionNamekeyPath быть: sectionNameKeyPath:@whoBy.name , это первый (и единственный) sortDescriptor в моем запросе fetchRequest.. Я чувствую, что добираюсь туда и почти достиг... но просто нужно немного руководства - спасибо! - person amitsbajaj; 22.10.2013
comment
@amitsbajaj: если для sectionNameKeyPath и дескриптора первой сортировки установлено значение @whoBy.name, все транзакции с одинаковым значением для whoBy.name должны быть сгруппированы в один и тот же раздел. Если есть разные имена, у вас должно быть несколько разделов. Возможно, проверьте правильность реализации numberOfSections и numberOfRowsInSection. - person Martin R; 22.10.2013
comment
спасибо за быстрый ответ - как ни странно, numberOfSections полностью отсутствовал! Когда я вставил это, теперь все работает гладко :) Я буду настраивать это сейчас, чтобы отразить выбранную пользователем дату, которая была бы намного лучше, но ваша помощь в этом шаге позволила добиться огромного прогресса! Еще раз спасибо Мартин :) - person amitsbajaj; 22.10.2013
comment
На самом деле, чтобы просто быстро спросить вас ... атрибут, который я помещаю в качестве заголовка раздела, не имеет ничего общего с первым sortDescriptor - должен ли я делать с ним что-то особенное? - person amitsbajaj; 22.10.2013
comment
@amitsbajaj: Каково ваше имя раздела, путь к разделу и каким должен быть заголовок раздела? - person Martin R; 22.10.2013
comment
sectionNameKeyPath:@occasion.dateOfEvent — заголовок раздела должен быть март 2013, февраль и т. д. На самом деле это атрибут с форматом NSDate прямо сейчас, но я собираюсь изменить его на строку, чтобы убедиться, что я знаю, что я я делаю сначала.. SortDescription - это whoBy.name, поэтому отличается от sectionNameKeyPath - person amitsbajaj; 22.10.2013
comment
@amitsbajaj: первый дескриптор сортировки должен использовать тот же ключ, что и sectionNameKeyPath. - person Martin R; 22.10.2013
comment
Спасибо, Мартин. Мне удалось заставить его работать с NSSortDescriptor:@whoBy.name с sectionNameKeyPath:@occasion.dateOfEvent, и поэтому, когда я добавляю эту запись, она создает разделы соответствующим образом - мне все еще нужно, чтобы это работало за пределами NSString и с датой, чтобы пользователи не просто печатали в сентябре 2013 года. Не знаю, почему это сработало, хотя NSSortDescriptor и sectionNameKeyPath разные... но я продолжу играть - пока что я благодарен за вашу помощь в этом Мартин... ваша постоянная помощь! - person amitsbajaj; 22.10.2013
comment
@amitsbajaj: Если мой ответ помог, было бы неплохо, если бы вы его приняли. В противном случае вы можете добавить дополнительную информацию к вопросу, и я постараюсь помочь. - person Martin R; 25.10.2013
comment
ой, мои извинения Мартин - я думал, что сделал это! Извините, я сделаю это сейчас - это очень помогло - еще раз спасибо! - person amitsbajaj; 25.10.2013