Перезагрузка UITableView за UISearchDisplayController
Я столкнулся с этим действительно странным явлением, которое я не могу понять. У меня есть UITableViewController, который управляет UITableView. Довольно просто. У меня также есть UISearchDisplayController для поиска содержимого табличного представления. Функция поиска сможет удалять элементы содержимого, отображаемого в виде таблицы. Поэтому, если пользователь хочет удалить один из элементов, найденных во время поиска, я хочу не только перезагрузить представление таблицы UISearchDisplayController, но и табличное представление UITableViewController. Когда я это делаю, разделы обычного представления таблицы выходят и отображаются над UISearchDisplayController. Это действительно странно. Я думаю, что лучший способ объяснить это с помощью изображения:
![http://img46.imageshack.us/img46/2818/screenshot20100905at140.png]()
Если кто-то из вас знает, что могло бы вызвать эту проблему или знать обходное решение, это было бы фантастически.
Ответы
Ответ 1
ОБНОВЛЕНО СНОВА
Как оказалось, если заголовок таблицы перезагружается в фоновом режиме, он появляется перед контроллером поиска независимо от того, что.
Я решил это, отключив fetchedResultsController (установив его на нуль) и позволяя ему лениво загружаться, когда это необходимо, когда поиск исчезает.
ОБНОВЛЕНО - исходный ответ ниже
В моем случае я использую два fetchedResultsControllers один для основного tableview и один для поиска.
Я обнаружил, что предотвращение анимации при добавлении заголовков разделов предотвращает эту ошибку. Поэтому, пока 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;
}
}
}
ОРИГИНАЛЬНЫЙ ОТВЕТ
Другой ответ на самом деле не работает сам по себе. Причина в том, что заголовок, который отображается, не является заголовком в представлении tableDisplayController. Это заголовок из основного табличного представления, который по какой-либо причине добавляется над представлением таблицы поиска в иерархии представлений.
Я решил эту проблему, отключив обновления в главном представлении таблицы, в то время как 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;
}
Тем не менее, у меня все еще есть проблема, что если я хочу перезагрузить Data в главном представлении таблицы, так что это видно в фоновом режиме, заголовки разделов все еще плавают перед темной областью.
У кого-нибудь есть лучшее решение для этого? Это похоже на законную ошибку для viewForHeaderInSection и titleForHeaderInSection, когда данные перезагружаются, когда они покрываются UISearchDisplayController.
Самый простой ответ для меня - попытаться переопределить поиск, чтобы вы не могли видеть таблицу фона. Но это отвлекает от "Appleness" приложения.
Ответ 2
Наше решение состоит в том, чтобы сделать следующее. Он был протестирован только в iOS 7:
- В
viewForHeaderInSection
верните нуль, если self.searchDisplayController.active
- YES
- В
didHideSearchResultsTableView
вызовите [self.tableView reloadData]
, чтобы перезагрузить заголовки, когда таблица поиска исчезает.
Ответ 3
В последнее время я столкнулся с этим... Подход, который я решил, заключался в том, чтобы очереди в главном tableView в приостановленной очереди последовательной отправки, пока UISearchDisplayController не скрывает searchResultsTableView. Вероятно, я считаю это ошибкой, так как заголовки разделов не должны отображаться через главный tableView, если searchResultsTableView занял этот уровень.
Ответ 4
Я решил это в iOS 7, только перезагружая видимые строки в базовой таблице.
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
}
Ответ 5
Исправлено.
Добавьте следующие строки в viewDidLoad
searchDisplayController.searchResultsTableView.delegate = self;
searchDisplayController.searchResultsTableView.dataSource = self;
Это исправило это для меня...
Ответ 6
[self.searchDisplayController.searchResultsTableView reloadData];
Ответ 7
Из-за использования UITableViewController
. self.view
является TableView
в UITableViewController
, а SearchDisplayController
ContainerView
добавляется к self.view
из UITableViewController
. Просто используйте UIViewcontroller
.
Ответ 8
Мое решение состояло в том, чтобы не перезагружать таблицу, если отображались результаты поиска, а затем перезагружались, когда результаты поиска были отклонены.
Мне пришлось установить символическую точку останова в reloadData UITableView, чтобы найти все вызовы перезагрузки, из-за которых заголовки разделов перерисовываются поверх таблицы поиска.
Ответ 9
Надеюсь, вы это догадались, но на всякий случай кто-то наткнулся на этот вопрос: это, вероятно, происходит потому, что ваш 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
}