ОБНОВЛЕНО СНОВА
Как выясняется, если заголовок таблицы не перезагружается в фоновом режиме он выскакивает на передней панели контроллера поиска независимо от того, что ,
Я решил это, отключив 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;
}
}
}
ОРИГИНАЛЬНЫЙ ОТВЕТ
Другой ответ на самом деле не работает на своем собственном. Причина в том, что заголовок, который отображается, не является заголовком в таблице viewDisplayController. Это заголовок из основного табличного представления, который по какой-то причине добавляется над представлением таблицы поиска в иерархии представлений.
Я решил эту проблему, отключив обновления в главном представлении таблицы, в то время как 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;
}
Однако я до сих пор есть проблема, что если я хочу reloadData на главной Tableview так это в фоновом режиме, заголовки разделов все еще плавают перед темной областью.
У кого-нибудь есть лучшее решение для этого?Это похоже на законную ошибку для viewForHeaderInSection и titleForHeaderInSection, когда данные перезагружаются, когда они покрываются UISearchDisplayController.
Самый простой ответ для меня - попытаться переопределить поиск, чтобы вы не могли видеть таблицу фона. Но это отвлекает от «Приближения» приложения.
Одинаковая проблема, больше скриншотов: http://stackoverflow.com/questions/14994997/uisearchdisplaycontroller-shows-header-section-of-parent-uitableviewcontroller – Douglas
Чудесно, 2 года спустя это все еще проблема: http: // openradar.appspot.com/14676046 Похоже, Apple никогда не исправляла это, потому что они заменили UISearchDisplayController в iOS 8. – Keab42