Перезагрузка UITableView за UISearchDisplayController
Я столкнулся с этим действительно странным явлением, которое не могу понять. У меня есть UITableViewController, который управляет UITableView. Довольно просто У меня также есть UISearchDisplayController для поиска содержимого табличного представления. Функция поиска сможет удалять элементы содержимого, отображаемого в табличном представлении. Поэтому, если пользователь решит удалить один из элементов, найденных им во время поиска, я хочу не только перезагрузить табличное представление UISearchDisplayController, но и табличное представление UITableViewController. Когда я делаю это, секции обычного табличного представления появляются и отображаются над UISearchDisplayController. Это действительно довольно странно. Я думаю, что лучший способ объяснить это с помощью изображения:
Если кто-то из вас знает, что может быть причиной этой проблемы или знает обходной путь, это было бы замечательно.
9 ответов
ОБНОВЛЕНО СНОВА
Оказывается, если заголовок таблицы перезагружается в фоновом режиме, он появляется перед контроллером поиска, несмотря ни на что.
Я решил это, отключив fetchedResultsController (установив его на nil) и позволив ему снова загружаться лениво, когда это необходимо, когда поиск исчезает.
ОБНОВЛЕНО - Оригинальный ответ ниже
В моем случае я использую два fetchedResultsControllers один для основного просмотра таблицы и один для поиска.
Я обнаружил, что предотвращение анимации при добавлении заголовков раздела предотвращает эту ошибку. Так что пока searchDisplayController.active я просто отключаю анимацию смены раздела. см. код ниже.
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
if (!self.reordering) {
UITableView *myTableView = controller == __fetchedResultsController ? self.tableView : self.searchDisplayController.searchResultsTableView;
UITableViewRowAnimation animation;
if (self.searchDisplayController.active) {
animation = UITableViewRowAnimationNone;
} else {
animation = UITableViewRowAnimationFade;
}
switch(type)
{
case NSFetchedResultsChangeInsert:
[myTableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation];
break;
case NSFetchedResultsChangeDelete:
[myTableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation];
break;
}
}
}
ОРИГИНАЛЬНЫЙ ОТВЕТ
Другой ответ на самом деле не работает сам по себе. Причина в том, что отображаемый заголовок не является заголовком в табличном представлении searchDisplayController. Это заголовок основного табличного представления, который по какой-то причине добавляется над табличным поиском в иерархии представлений.
Я решил эту проблему, отключив обновления основной таблицы, пока searchDisplayController.active = YES.
В моем случае я использую загруженный контроллер результатов, поэтому я сделал это так:
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {
[self.tableView reloadData];
}
- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
self.fetchedResultsController.delegate = nil;
self.fetchedResultsController = nil;
}
Тем не менее, у меня все еще есть проблема, что если я хочу перезагрузить данные в главном табличном представлении, чтобы они были видны на заднем плане, заголовки разделов все еще плавают перед затемненной областью.
У кого-нибудь есть лучшее решение для этого? Это похоже на допустимую ошибку для viewForHeaderInSection и titleForHeaderInSection, когда данные перезагружаются, когда они покрываются UISearchDisplayController.
Самый простой ответ для меня - попытаться переопределить представление поиска, чтобы вы не могли видеть фоновую таблицу. Но это отнимает у Appleness приложения.
Наше решение заключается в следующем. Это было только проверено в iOS 7:
- В
viewForHeaderInSection
, верните ноль, еслиself.searchDisplayController.active
Да - В
didHideSearchResultsTableView
, вызов[self.tableView reloadData]
перезагрузить заголовки, когда исчезнет таблица поиска
Я также столкнулся с этим недавно... подход, который я решил, заключался в том, чтобы ставить обновления в основной tableView в очереди приостановленной последовательной отправки до тех пор, пока UISearchDisplayController не скрывает searchResultsTableView. Вероятно, я бы посчитал это ошибкой, поскольку заголовки разделов не должны отображаться в основном tableView, если searchResultsTableView занял этот слой.
Я решил это в iOS 7, перезагрузив только видимые строки в базовой таблице.
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
}
[self.searchDisplayController.searchResultsTableView reloadData];
Из-за использования UITableViewController
, self.view
это TableView
в UITableViewController
а также SearchDisplayController
"s ContainerView
добавляется в self.view
из UITableViewController
, Просто используйте UIViewcontroller
,
Починил это..
Добавьте следующие строки в viewDidLoad
searchDisplayController.searchResultsTableView.delegate = self;
searchDisplayController.searchResultsTableView.dataSource = self;
Это исправило это для меня...
Мое решение состояло в том, чтобы избежать перезагрузки таблицы, если отображаются результаты поиска, а затем повторной загрузки в любое время, когда результаты поиска были отклонены.
Мне пришлось установить символическую точку останова на UITableView reloadData, чтобы найти все вызовы для перезагрузки, которые вызывали перерисовку заголовков разделов в верхней части таблицы поиска.
Надеюсь, вы уже поняли это, но на всякий случай кто-то наткнется на этот вопрос: это, вероятно, происходит потому, что ваш UITableViewController является источником / делегатом данных для таблицы поиска, а также для вашей основной таблицы. То есть, предположительно, у вас есть одинаковые методы UITableViewDelegate/DataSource, выполняющиеся для обоих табличных представлений, и вы возвращаете одинаковый заголовок раздела для обеих таблиц. Убедитесь, что вы обрабатываете таблицу результатов поиска отдельно:
- (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section {
if (aTableView == [[self searchDisplayController] searchResultsTableView]) {
return nil;
}
// Return a title appropriate for self.tableView here
}