Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

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

Шрифт:

<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.

Вот типичная реализация вышеупомянутых методов в приложении, которое было описано ранее в этом разделе:

— (void) controllerWillChangeContent:(NSFetchedResultsController *)controller{

[self.tableView beginUpdates];

}

— (void) controller:(NSFetchedResultsController *)controller

didChangeObject:(id)anObject

atIndexPath:(NSIndexPath *)indexPath

forChangeType:(NSFetchedResultsChangeType)type

newIndexPath:(NSIndexPath *)newIndexPath{

if (type == NSFetchedResultsChangeDelete){

[self.tableView

deleteRowsAtIndexPaths:@[indexPath]

withRowAnimation: UITableViewRowAnimationAutomatic];

}

else if (type == NSFetchedResultsChangeInsert){

[self.tableView

insertRowsAtIndexPaths:@[newIndexPath]

withRowAnimation: UITableViewRowAnimationAutomatic];

}

}

— (void) controllerDidChangeContent:(NSFetchedResultsController *)controller{

[self.tableView endUpdates];

}

Остановимся также на передаче информации в табличный вид с помощью различных методов контроллера для представления результатов выборки — об этом мы также упоминали ранее. Одним из таких методов является objectAtIndexPath:. Простая реализация этого метода в табличном виде может выглядеть примерно так:

— (NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section{

id <NSFetchedResultsSectionInfo> sectionInfo =

self.frc.sections[section];

return sectionInfo.numberOfObjects;

}

— (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath{

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

Законы Рода. Том 3

Мельник Андрей
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин

Лекарь Империи

Карелин Сергей Витальевич
1. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи

Ким

Киплинг Редьярд Джозеф
Приключения:
исторические приключения
7.62
рейтинг книги
Ким

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

День поминовения

Нотебоом Сэйс
Проза:
современная проза
5.00
рейтинг книги
День поминовения

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

Бастард Императора. Том 15

Орлов Андрей Юрьевич
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 15

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Меткий стрелок. Том II

Вязовский Алексей
2. Меткий стрелок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Меткий стрелок. Том II

Академия

Щепетнов Евгений Владимирович
3. Петр Синельников
Фантастика:
фэнтези
6.20
рейтинг книги
Академия

Государь

Мазин Александр Владимирович
7. Варяг
Фантастика:
альтернативная история
8.93
рейтинг книги
Государь