Вход/Регистрация
iOS. Приемы программирования
вернуться

Нахавандипур Вандад

Шрифт:

Контроллер для представления результатов выборки также отслеживает изменения, происходящие в том контексте, с которым он связан. Допустим, контроллер для представления результатов выборки создан в контроллере вида А, а в контроллере вида B мы удаляем объект из нашего контекста. Поскольку удаление происходит в контроллере вида B, первый контроллер вида А, владеющий контроллером для представления результатов выборки, будет об этом уведомлен. При этом предполагается, что контроллер вида А является делегатом контроллера для представления результатов выборки. Такое соотношение контроллеров удобно и очень нам пригодится. Предположим следующее: мы разрабатываем приложение, в котором пользователь видит на экране два контроллера вида. Корневой контроллер вида является табличным. В нем перечислены все пользовательские контакты. Во втором контроллере вида пользователь может добавить новый контакт. Как только пользователь нажмет в контроллере вида кнопку Save (Сохранить) и вернется к списку своих контактов, этот список уже будет обновлен благодаря механизму делегирования, действующему в контроллере, представляющем результаты выборки.

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

#import «PersonsListTableViewController.h»

#import «AppDelegate.h»

#import «Person.h»

#import «AddPersonViewController.h»

static NSString *PersonTableViewCell = @"PersonTableViewCell";

@interface PersonsListTableViewController 

<NSFetchedResultsControllerDelegate>

@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 =

[[NSFetchedResultsController alloc]

initWithFetchRequest: fetchRequest

managedObjectContext: [self managedObjectContext]

sectionNameKeyPath: nil

cacheName: nil];

self.frc.delegate = self;

NSError *fetchingError = nil;

if ([self.frc performFetch:&fetchingError]){

NSLog(@"Successfully fetched.");

} else {

NSLog(@"Failed to fetch.");

}

Как видите, контроллер для представления результатов выборки принимает контроллер актуального табличного вида в качестве своего делегата. Делегат контроллера для представления результатов выборки должен соответствовать протоколу NSFetchedResultsControllerDelegate. Вот некоторые из наиболее важных методов этого протокола.

• controllerWillChangeContent: — вызывается в делегате и сообщает ему об изменении контекста, служащего основой для контроллера, представляющего результаты выборки, а также о том, что содержимое контроллера, представляющего результаты выборки, вот-вот изменится с учетом внесенных изменений. Обычно этот метод используется для подготовки табличного вида к изменениям. Для этого в нем вызывается метод beginUpdates.

• controller: didChangeObject: atIndexPath: forChangeType: newIndexPath: — вызывается в делегате и сообщает ему о конкретных изменениях, сделанных в объекте из контекста. Например, если вы удаляете объект в контексте, то вызывается этот метод. При этом его параметр forChangeType содержит значение NSFetchedResultsChangeDelete. В другом случае, когда вы вставляете новый объект в контекст, этот параметр содержит значение NSFetchedResultsChangeInsert.

Кроме того, этот метод вызывается в методе делегата контроллера для представления результатов выборки, когда обновляется управляемый объект. Это происходит после того, как объект будет сохранен в объекте с помощью метода save:.

• controllerDidChangeContent: — вызывается в делегате и информирует его о том, что контроллер для представления результатов выборки был обновлен в результате обновления контекста управляемых объектов. Как правило, именно внутри этого метода программисты совершают вызов endUpdates, применяемый в табличных видах для обработки всех обновлений, поступивших в таблицу после срабатывания метода beginUpdates.

  • Читать дальше
  • 1
  • ...
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: