2010-09-05 3 views
15

Я столкнулся с этим странным явлением, которое я не могу понять. У меня есть UITableViewController, который управляет UITableView. Довольно просто. У меня также есть UISearchDisplayController для поиска содержимого табличного представления. Функция поиска сможет удалять элементы содержимого, отображаемого в виде таблицы. Поэтому, если пользователь хочет удалить один из элементов, найденных во время поиска, я хочу не только перезагрузить представление таблицы UISearchDisplayController, но и табличное представление UITableViewController. Когда я это делаю, разделы обычного представления таблицы выходят и отображаются над UISearchDisplayController. Это действительно странно. Я думаю, что лучший способ объяснить это с изображением:Перезагрузка UITableView за UISearchDisplayController

http://img46.imageshack.us/img46/2818/screenshot20100905at140.png

Если какой-либо из вас знает, что могло быть причиной этой проблемы или знаете обходной путь, который был бы фантастическим.

+1

Одинаковая проблема, больше скриншотов: http://stackoverflow.com/questions/14994997/uisearchdisplaycontroller-shows-header-section-of-parent-uitableviewcontroller – Douglas

+0

Чудесно, 2 года спустя это все еще проблема: http: // openradar.appspot.com/14676046 Похоже, Apple никогда не исправляла это, потому что они заменили UISearchDisplayController в iOS 8. – Keab42

ответ

-1

Надеюсь, вы это уже поняли, но на случай, если кто-то столкнется с этим вопросом: возможно, это происходит потому, что ваш 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 
} 
+2

Удивительно, но проблема в том, что фактические заголовки секций из UITableView в фоновом режиме отображаются над UITableView UISearchDisplayController. При прокрутке в результатах поиска заголовки фонового раздела отображаются фиксированными, плавающие над результатами поиска, так как результаты поиска перемещаются вверх и вниз позади них. – Douglas

+0

Я вижу то же самое - плавающие заголовки со стола внизу. Мы смогли решить проблему в iOS 6, вызвав [self.searchDisplayController.searchResultsTableView reloadData] в некоторых местах, но он не работает в iOS 7. – EricS

7

ОБНОВЛЕНО СНОВА

Как выясняется, если заголовок таблицы не перезагружается в фоновом режиме он выскакивает на передней панели контроллера поиска независимо от того, что ,

Я решил это, отключив 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.

Самый простой ответ для меня - попытаться переопределить поиск, чтобы вы не могли видеть таблицу фона. Но это отвлекает от «Приближения» приложения.

2

Я также столкнулся с этим в последнее время ... Подход, который я решил, заключался в очереди обновлений основного экрана TableView в приостановленной очереди последовательной отправки, пока UISearchDisplayController не скрывает searchResultsTableView. Вероятно, я считаю это ошибкой, так как заголовки разделов не должны отображаться через главный tableView, если searchResultsTableView занял этот уровень.

3

Наше решение состоит в том, чтобы сделать следующее. Он был протестирован только в прошивке 7:

  1. В viewForHeaderInSection, вернуть ноль, если self.searchDisplayController.active ДА
  2. В didHideSearchResultsTableView, вызовите [self.tableView reloadData] перезагрузить заголовки, когда таблица поиска исчезает
0

Fixed его. .

Добавьте следующие строки в viewDidLoad

searchDisplayController.searchResultsTableView.delegate = self; 
searchDisplayController.searchResultsTableView.dataSource = self; 

Это исправлено для меня ...

2

Я решил это в iOS 7, только перезарядив видимые строки в базовой таблице.

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView 
{ 
    [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone]; 
} 
+0

Это сработало для меня. У меня была секция, перезагружавшаяся каждую секунду, из-за которой заголовок отображался поверх моей таблицы поиска. По какой-то причине перезагрузка, видимая, а не указание самих indexPaths. Наиболее определенно ошибка. –

+0

Это будет работать, только если базовая модель данных не изменилась. – vincentjames501

0
[self.searchDisplayController.searchResultsTableView reloadData]; 
0

Из-за использования UITableViewController. self.view является TableView в UITableViewController и SearchDisplayControllerContainerView добавляется к self.view от UITableViewController. Просто используйте UIViewcontroller.

0

Мое решение состояло в том, чтобы избежать перезагрузки таблицы, если были отображены результаты поиска, а затем перезагрузка в любое время, когда результаты поиска были уволены.

Мне пришлось установить символическую точку останова в reloadData UITableView, чтобы найти все вызовы перезагрузки, вызывающие перерисовку заголовков разделов поверх таблицы поиска.

Смежные вопросы