• objectAtIndexPath: (метод экземпляра, возвращает управляемый объект) — объекты, выбираемые с помощью описываемого контроллера, их можно получать по индексу в разделе или строке. Строки каждого раздела нумеруются от 0 до
• fetchRequest (свойство типа NSFetchRequest) — если в любой точке вашего приложения возникнет необходимость заменить объект запроса выборки контроллером для представления результатов выборки, то это можно сделать с помощью свойства fetchRequest экземпляра NSFetchedResultsController. Такая возможность будет полезна, например, если необходимо изменить дескрипторы сортировки (о них подробно рассказано в разделе 16.6) запроса выборки — уже после того, как вы выделили и инициализировали ваши контроллеры для представления результатов выборки.
Контроллер для представления результатов выборки также отслеживает изменения, происходящие в том контексте, с которым он связан. Допустим, контроллер для представления результатов выборки создан в контроллере вида А, а в контроллере вида B мы удаляем объект из нашего контекста. Поскольку удаление происходит в контроллере вида B, первый контроллер вида А, владеющий контроллером для представления результатов выборки, будет об этом уведомлен. При этом предполагается, что контроллер вида А является делегатом контроллера для представления результатов выборки. Такое соотношение контроллеров удобно и очень нам пригодится. Предположим следующее: мы разрабатываем приложение, в котором пользователь видит на экране два контроллера вида. Корневой контроллер вида является табличным. В нем перечислены все пользовательские контакты. Во втором контроллере вида пользователь может добавить новый контакт. Как только пользователь нажмет в контроллере вида кнопку Save (Сохранить) и вернется к списку своих контактов, этот список уже будет обновлен благодаря механизму делегирования, действующему в контроллере, представляющем результаты выборки.
В описанном приложении потребуется объявить табличный контроллер вида, в котором все пользовательские контакты перечислены следующим образом:
#import «PersonsListTableViewController.h»
#import «AppDelegate.h»
#import «Person.h»
#import «AddPersonViewController.h»
static NSString *PersonTableViewCell = @"PersonTableViewCell";
@interface PersonsListTableViewController ()
@property (nonatomic, strong) UIBarButtonItem *barButtonAddPerson;
@property (nonatomic, strong) NSFetchedResultsController *frc;
@end
Кнопка панели, объявленная в этом коде, будет представлять собой простую кнопку +. Этот плюсик будет находиться на навигационной панели. Такая кнопка позволяет пользователю перейти в контроллер вида Add Person (Добавить контакт), где можно будет добавить новый контакт в имеющийся контекст управляемых объектов. Контроллер для представления результатов выборки также будет использоваться для выборки контактов из контекста и последующего их отображения в табличном виде.
Вот как создается контроллер для представления результатов выборки:
/* Сначала создаем запрос выборки данных */
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]
initWithEntityName:@"Person"];
NSSortDescriptor *ageSort =
[[NSSortDescriptor alloc] initWithKey:@"age"
ascending: YES];
NSSortDescriptor *firstNameSort =
[[NSSortDescriptor alloc] initWithKey:@"firstName"
ascending: YES];
fetchRequest.sortDescriptors = @[ageSort, firstNameSort];
self.frc =