Используйте NSFetchedResultsControllerDelegate для обновления разделов и строк TableView после изменения NSPredicate - PullRequest
5 голосов
/ 01 января 2011

Есть ли способ обновить разделы и строки UITableView после изменения fetchedResultsControllers NSpredicate (и выполнения выборки)?Я хотел бы использовать методы делегата controllerWillChangeContent для обновления моей таблицы при изменении searchText в моем searchBar.

В настоящее время в моем приложении эти методы делегата вызываются только тогда, когда происходят изменения в coredata.Не при изменении предиката resultsController и выполнении извлечения.

Если я просто вызываю [self.tableView reloadData] при каждом обмене текстами, анимации нет, и это немного блокирует опыт.

Или я долженсделать что-то совершенно другое, чтобы обновить содержимое tableView при каждом изменении текстовой записи поиска?

Ответы [ 4 ]

8 голосов
/ 02 января 2011

Я еще раз изучил документацию Apple, и похоже, что методы NSFetchedResultsControllerDelegate не вызываются при изменении предиката:

Экземпляр NSFetchedResultsController использует методы в этом протоколе для уведомления своего делегатачто результаты выборки контроллера были изменены из-за операций добавления, удаления, перемещения или обновления.

Итак, чтобы ответить на мой собственный вопрос: невозможно использовать NSFetchedResultsControllerDelegate для обновления таблицы после NSFetchedResultsControllerПредикат изменений.

0 голосов
/ 01 января 2011

Вы можете попробовать использовать UITableView метод reloadSections:withRowAnimation:, передав NSIndexSet со всеми вашими разделами.Таким образом, вы должны перезагрузить все это, но при этом получить анимацию по вашему выбору.

Если вы добавляете и удаляете строки, вам нужно будет использовать insertSections:withRowAnimation: и removeSections:withRowAnimation:.Если вы делаете несколько изменений одновременно, вы должны также делать их между вызовами на beginUpdates и endUpdates.

0 голосов
/ 02 января 2011

Из ссылки на класс NSFetchedResultsController:

Изменение запроса на выборку

Вы не можете просто изменить запрос на выборку изменить результаты. Если хотите Для изменения запроса на выборку необходимо:

Если вы используете кеш, удалите его (используя deleteCacheWithName :). Обычно вы не должны использовать кеш если вы меняете запрос на выборку.

Изменить запрос на выборку. взывать performFetch:.

Поскольку вы изменили предикат, вы должны снова вызвать executeFetch: и тогда делегат будет обрабатывать обновление таблицы оттуда.

0 голосов
/ 01 января 2011

Попробуйте позвонить [self.tableView reloadData] в

-(void)viewWillAppear:(BOOL)animated;
                 or
-(void)viewDidAppear:(BOOL)animated;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...