ОБНОВЛЕНО СНОВА
Как оказалось, если заголовок таблицы перезагружается в фоновом режиме, он появляется перед контроллером поиска, несмотря ни на что.
Я решил эту проблему, отключив fetchedResultsController (установив его в ноль) и позволив ему снова загружаться лениво при необходимости, когда поиск исчезает.
ОБНОВЛЕНО - Оригинальный ответ ниже
В моем случае я использую два контроллера fetchedResultsController, один для основного просмотра таблицы и один для поиска.
Я обнаружил, что предотвращение анимации при добавлении заголовков разделов предотвращает эту ошибку. Так что пока 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 приложения.