Базовые Данные fetchedresultscontroller вопрос: для чего “разделы”?

Я пытаюсь узнать Базовые Данные (я - новичок при разработке iPhone), и чтобы сделать это, я пытаюсь получить объект от fetchedresultscontroller и NSlog, это - имя (свойство объекта). Я пытался сделать это как это:

NSArray *ar = [NSArray arrayWithArray:[fetchedResultsController sections]];
Task *t = [ar objectAtIndex:0];
NSLog(@"%@", t.taskName);

Однако приложение, разрушенное с этой ошибкой: сбои приложения с ошибкой

Завершение приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '*** - [_NSDefaultSectionInfo taskName]: нераспознанный селектор, отправленный в экземпляр 0x3d1f670'

Я с тех пор узнал, что необходимо использовать выбранное свойство объектов для этого, но затем для чего разделы? Спасибо за любую справку извините, если это - в высшей степени глупый вопрос. Я просмотрел документацию, но все еще не понимаю.

5
задан Peter Hosey 11 May 2010 в 10:25
поделиться

1 ответ

NSFetchedResultsController может сгруппировать ваши объекты в разделы на основе указанного вами ключа. Так, например, если ваша сущность имеет свойство category , вы можете сгруппировать свои объекты по категории и отобразить их под заголовком для этой категории.

Каждый UITableView (и каждый NSFetchedResultsController ) содержит по крайней мере один раздел, поэтому, даже если вы не используете эту функцию, вам все равно придется иметь дело с разделами. Если вы проверите документацию , то увидите, что объекты в свойстве section соответствуют протоколу NSFetchedResultsSectionInfo , который имеет объекты ], которое содержит объекты в этом разделе.

Есть два способа получить реальный объект из NSFetchedResultsController :

id <NSFetchedResultsSectionInfo> sectionInfo = [fetchedResultsController.sections objectAtIndex:0];
Task *task = [sectionInfo.objects objectAtIndex:0];

Другой, гораздо более простой и предпочтительный способ - использовать метод objectAtIndexPath: .

Task *task = [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

Эти два образца эквивалентны. UIKit добавляет некоторые методы в NSIndexPath , чтобы упростить работу с табличными представлениями и контроллерами полученных результатов. Также обратите внимание, что все методы UITableViewDataSource и UITableViewDelegate предоставляют вам объекты NSIndexPath , поэтому вы можете просто передать их в objectAtIndexPath: чтобы получить правильный объект для этой ячейки.

Apple также предоставляет достойное руководство по использованию Core Data на iPhone. Он ответит на многие ваши вопросы. К сожалению, он не охватывает подробно NSFetchedResultsController .

27
ответ дан 18 December 2019 в 06:02
поделиться