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

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

Жанры

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{

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

Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Ланьлинский насмешник
Старинная литература:
древневосточная литература
7.00
рейтинг книги
Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

70 Рублей - 2. Здравствуй S-T-I-K-S

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Лучше подавать холодным

Аберкромби Джо
4. Земной круг. Первый Закон
Фантастика:
фэнтези
8.45
рейтинг книги
Лучше подавать холодным

Имперец. Земли Итреи

Игнатов Михаил Павлович
11. Путь
Фантастика:
героическая фантастика
боевая фантастика
5.25
рейтинг книги
Имперец. Земли Итреи

Адвокат империи

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

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Энфис 5

Кронос Александр
5. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 5

Опасная любовь командора

Муратова Ульяна
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Опасная любовь командора

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан